基于注解的AOP开发
快速入门
基于注解的aop开发步骤:
- 创建目标接口和目标类
- 创建切面类
- 将目标类和切面类的对象创建对象权交给Spring-用@Component创建
- 在切面类中使用注解配置织入关系
- 在配置文件中开启组件扫描 和AOP的自动代理
- 测试
实现
1、2步将之前的粘贴过去,完成
3. 将目标类和切面类的对象创建对象权交给Spring-用@Component创建
@Component("myAspect")
-
在切面类中使用注解配置织入关系
- 通过@Aspect标注当前MyAspect是一个切面
- 配置织入,通过注解配置,首先@Before,标注当前函数是什么增强,然后括号内标注切点表达式(省略了Value=)。如:
@Before("execution(* com.itheima.anno.*.*(..))")
-
在配置文件中开启组件扫描 和AOP的自动代理
- 配置头文件两个位置,加入context
- 设置组件扫描
<context:component-scan base-package="com.itheima.anno"></context:component-scan> <!--aop自动代理--> <aop:aspectj-autoproxy/>
-
测试
注解配置AOP详解
1.注解通知的类型
通知的配置语法:@通知注解("切点表达式")
- 前置通知 @Before
- 后置通知 @AfterReturning
- 环绕通知 @Around
- 异常抛出通知 @AfterThrowing
- 最终通知 @After
2.切点表达式的抽取
此时也存在通用切点表达式的现象,要进行进一步解耦
同xml配置aop一样,可以进行切点表达式抽取,抽取方式是切面内定义方法,在该方法下使用@Pointcut注解定义切点表达式,然后在增强注解中引用
@Pointcut("execution(* com.itheima.anno.*.*(..))")
public void pointcut(){}
//配置前置增强
@Before("pointcut()")
//第二种抽取方法
@Around("MyAspect.pointcut()")
3.知识要点
- 注解aop开发步骤
- 使用@Aspect标注切面类
- 使用@通知注解标注通知方法和切点表达式
- 在配置文件中配置aop自动代理和扫描
- 通知注解类型
- 前置通知 @Before
- 后置通知 @AfterReturning
- 环绕通知 @Around
- 异常抛出通知 @AfterThrowing
- 最终通知 @After
JdbcTemplate
JdbcTemplate基本使用
JdbcTemplate概述
它是Spring框架中提供的一个对象,是对Jdbc API的简单封装。Spring框架为我们提供了很多的操作模板类。如操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库用RedisTemplate
操作消息队列的JmsTemplate
JdbcTemplate开发步骤
- 导入spring-jdbc和spring-tx(事务)坐标
- 创建数据库表和实体
- 创建JdbcTemp对象
- 执行数据库操作
-
首先在pom.xml中导入坐标
-
创建数据库表和对应实体,生成get&set
-
创建JdbcTemplate对象
若执行增删改操作,调用update函数,若进行查询操作,调用quary函数
同时也得进行数据库连接- 创建数据源对象
- 设置JdbcTemplat对象e,并设置数据源对象
- 执行操作
ComboPooledDataSource dataSource=new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUser("root"); dataSource.setPassword("123"); JdbcTemplate jdbcTemplate = new JdbcTemplate(); //设置数据源对象,知道数据库在哪 jdbcTemplate.setDataSource(dataSource); //执行操作 int row=jdbcTemplate.update("insert into account values (?,?)","Tom","5000"); System.out.println(row);
Sprin*生JdbcTemplate对象
我们可以将jdbcTemplate创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将DataSource注入到JdbcTemplate模板对象中
- 配置数据源对象,注入四个参数
- Sprin*生模板对象,注入数据源对象
配置过程:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="123"/>
</bean>
<!-- 配置Jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
注入与测试过程:
@Test
//测试Sprin*生jdbc模板对象
public void test2() throws Exception{
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = app.getBean(JdbcTemplate.class);
int row=jdbcTemplate.update("insert into account values (?,?)","Zhang","1000");
System.out.println(row);
}
这两个过程也可以用注解进行简化
将整个过程进一步抽取
将数据源数据相关配置抽取到properties文件,见之前配置数据源的操作
JdbcTemplate的常用操作
-
修改操作
-
删除操作
-
查询操作
在进行查询时.query有多个函数,此时常用第一个,RowMapper是进行封装的一个接口,用的时候用该接口对应的实现类,完成数据实体的封装 ctrl+alt+B看它的实现
查询多个对象时List<Account> accountList = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
此时,.query第二个参数,是该接口的Bean实现,其中<>内选择其实现类,由于内部写了toString方法,所以可以直接打印。
查询单个参数时,选择queryForObject中,有args参数的实现Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), "Zhang");
当对返回属性有要求时,都需要实体属性的行映射
查询一些数据如数目等时,选择 requireType的实现,因为此时不需要映射封装,只要把数据强制转换就行
Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class); System.out.println(count);
JdbcTemplate知识要点
创建步骤
- 导入spring-jdbc和spring-tx(事务)坐标
- 创建数据库表和实体
- 创建JdbcTemp对象
- 执行数据库操作