AOP概念
AOP(概念)
1、什么是AOP
(1)面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得
业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
(2)通俗描述:不通过修改源代码方式,在主千功能里面添加新功能
方法增强
用动态代理实现方法增强例子:
@Test
public void demo3(){
final ICat cat = new Cat();//原对象
ICat catProxy = (ICat) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] objs)
throws Throwable {
//增强run方法
if(method.getName().equals("run")){
method.invoke(cat,objs);//调用原对象的方法,保留原方法的功能
//新增功能
System.out.println("抓住第三只老鼠");
}
return null;
}
});
catProxy.run();
}
execution的格式:
4、切入点表达式
I
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构:
execution([限修饰符][返回类型][类全路径][方法名称]/(参数列表])
举例1:对com. atquigu.dao. BookDao类里面的add进行增强
execution( com, atquiqu. dao, BookDao, add(…).
举例2:对com. atquigu.dao. BookDao类里面的所有的方法进行增强
execution( com. atquiqu. dao. BookDao. *(
对com.dao包下的所有类,所有方法进行增强:
> excution(*com.dao.*./*(..))
springxml配置文件中配置切入点:
<!--创建对象-->
<bean id="book" class ="com.spring5.Book"></bean>
<bean id="bookProxy" class ="com.spring5.BookProxy"></bean>
<!--配置AOP增强-->
<aop:config>
<!--切入点-->
<aop:pointcut id="p" expression ="execution(* com.spring5. Book. buy (..))"/>
<!--配置切面-->
<aop:aspect ref="bookProxy">
<!--增强作用在具体的方法上-->
<aop:before mehod="before" pointcut-ref="p"/>
</aop:aspect>
</aop: config>
</beans>
基于AspectJ注解的方式进行AOP操作
1.创建类,在类里面定义方法
public class User{
public void add(){
System.out.printIn("add..");
}}
2.创建增强类
(1)在增强类里面创建方法,让不同方法代表不同通知类型
//增强的类
public class UserProxy{
//前置通知
public void before(){
}
}
3.进行通知的配置
(1)在spring配置文件中开启注解扫描
(2)开启ASpecJ生成代理对象
4.有多个增强类对同一个方法增强,可以设置增强类优先级:
在增强类上面添加注解@Order(数字),数字类型越小优先级越高
@Component
@Aspect
@Order(1)
public class PerProxy{
}
完全注解开发(不再需要XML配置文件)
加上配置类,在配置类上面加上注解:
@Configuration
@ComponentScan(basePackages={
"com.spring5"})
@EnableAspectJAutoProxy
public class Config{
}
JDBCtemplate概述
准备工作:
(1)导入相关jar包
(2)在spring配置文件中配置数据库连接池
(3)配置JDBCtemplate对象,注入DataSource
(2)在spring配置文件配置数据库连接池
<!--数据库连接池-->
<bean id="" class= "com.alibaba.druid.pool. DruidDatasaurce"
destroy method="close" >;
<property name="url" value="jdbe: mysql: ///user_db"/>
<property name="userame" value="root"/>
<property nane="password" value="root"/>
<property nane driverClassName value="com.mysql.jdbc. Driver"/>
</bean>
丬
<!--(3)配置JdbeTemplate对象,注入 DataSource
-JdbeTesplate对象-->
<bean id="jdbcTemplate"class="org.springframework.jdbc. core.JdbcTemplate">
<!--注入 datasource-->
<property name="dataSource" ref ="dataSource"></property>.
</bean>.
(4)创建service类,创建dao类,在dao注入jdbcTemplate对象
配置文件中:开启组件扫描
<context:component-scan base-package="com.spring5"></context:component-scan>
java:
service:
public class BookService{
@Autowired//注入DAO
private BookDao bookDao;}
dao:
public interface BookDao{
}
BookDao的实现类:
@Repository
public class BookDaoImol implements BookDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
之后:
1。创建enetiy实体类
2.编写service和dao
(1)在Dao进行数据库添加操作
(2)调用JdbcTemplate的update方法【有两个参数,第一个是sql语句,第二个是可变参数】
在上述代码中做修改:
public class Book{
private String id;
private String name;
private String status;
//省略了getter setter
}
public interface BookDao{
public void add(Boook book);
}
service:
public class BookService{
public void addBook(Book book){
bookDao.add(book);}
}
@Repository
public class BookDaoImol implements BookDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void add(Book book){
String sql = "insert into xx value(?,?,?)";
int update = jdbcTemplate.update(sql,book.getId,book.getName,book.getStatus);
}
测试类:
@Test
public void test JdbeTemplate(){
ApplicationContext context=
new ClassPathXmlApplicationContext("beanl. xml");
BookService bookService= context. getBean("bookService", BookService.class);
Book book= new Book();
book.setId("1");
book.setName("java");
book.setUstatus("a");
bookService.addBook(book);
}