注解:代码中特殊的标记(例如@Test),使用注解可以完成相关的功能
注解写法:@注解名称(属性名称=属性值)
注解的使用:类/方法/属性都可以使用
spring注解开发:使用注解创建对象,可以代替部分配置文件
需要导入spring-aop-4.3.14.RELEASE.jar
1:创建类,创建方法,创建配置文件,引入约束
[引入的约束改变:Context开头的约束,除了beans,还有Context]
2:配置文件[applicationContext]
创建对象:
//注解的方式创建对象 类似于
@Component(value = "user")
public class User {
public void add() {
System.out.println("add.......");
}
}
获得对象,调用对象
public void test1() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
user.add();
}
常用注解:
spring中提供@Component的三个衍生注解:(功能目前上是一致的)
三个注解的存在是为了让标注类的本身用途清晰,spring在后续版本会对其增强
@Component :所有的注解
@Controller :WEB层
@Service :service层
@Repository :持久层
设置对象属性的标注:
@Scope(value="prototype") //创建多实例
@Autowired //对象注入,自动注入对象,通过类型称注入对象
@Qulifiter //加上此标签, @Autowired就能够通过名称注入对象
@Resoure //自动注入,通过对象名称注入对象
接口的使用:
创建配置文件,并打开注解配置,并创建对象
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="spring">context:component-scan>
<bean id="person" class="spring.doc.test.Person">bean>
<bean id="PersonService" class="spring.doc.test.PersonService">bean>
beans>
主类Person
public class Person {
// 根据类名找到类对应的对象,@Resource(name="userDao") name的值为注解方式创建的对象名称
@Resource(name = "PersonService")
private PersonService personService;//创建此类的共有属性后为其通过注解方式获得对象,将对象赋给此全局变量
public void say() {
System.out.println("xml配置创建对象");
personService.test();
}
}
注入类Person
public class Person {
// 根据类名找到类对应的对象,@Resource(name="userDao") name的值为注解方式创建的对象名称
@Resource(name = "PersonService")
private PersonService personService;//创建此类的共有属性后为其通过注解方式获得对象,将对象赋给此全局变量
public void say() {
System.out.println("xml配置创建对象");
personService.test();
}
}
测试
@Test
public void testPeronDemo() {
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
Person person = (Person) context.getBean("person");
person.say();
}
提供了面向切面的编程实现/又叫做面向方面编程,是oop(面向对象编程)的一种补充,基于动态代理实现,可以拓展功能不通过修改源代码实现
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能见识/事务管理/安全检查/缓存)
静态代理[通过接口代理]
定义接口
需要增强的目标[此类需要实现代理的接口]
增强的代理类[通过接口调用需要增强的目标的方法]
测试
结果
Proxy[只能适用于有接口的动态代理,JDK自带]
定义接口
要增强的目标类[实现接口]
增强类
CGLIB[需要导入CGLIB的jar包]
连接点:被拦截到的点,在spring中指的是方法,spring只支持方法类型的连接点,即类中可以被增强的方法
Pointcut(切入点):要对哪些连接点进行拦截定义,在类中可以有很多的方法被增强,而被增强的方法就是切入点,即类中被增强的方法--重点
Aivice(通知/增强):增强的代码,称为增强,增强分为几种类型--重点
前置通知:方法执行之前执行增强
后置通知:方法执行之后执行增强
异常通知:出现异常时执行的增强
最终通知:在后置之后执行的增强
环绕通知:例如进行操作计时的环绕通知
Aspect(切面):将增强具体的应用到具体的方法上面,过程称为切面,即将增强引用到切入点的过程--重点
Intorduction(引介):可以动态的添加属性和方法,一般不使用
Target(目标对象):代理的目标对象
Wevaing(织入):将增强应用到目标对象的过程
Proxy(代理):被AOP增强之后,就是一个代理对象
org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。
任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法:
java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
Signature getSignature() :获取连接点的方法签名对象;
java.lang.Object getTarget() :获取连接点所在的目标对象;
java.lang.Object getThis() :获取代理对象本身;
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:
java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。
导入AOP和AspectJ的jar包,自己从官网下载
为spring支持aspectj所需包
为spring支持AOP所需的包
增强目标
创建spring配置文件(applicationContext.xml),并导入AOP的约束
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
代理配置
通过表达式配置切入点--对哪一个方法增强[重点掌握]
配置全局切入点
<aop:pointcut expression="execution(* spring.aop.BookTest.add(..))" id="pointcut1" />
execution参数的常用的表达式[重点]
execution(访问修饰符 要增强方法的全路径):
execution(* spring.aop.BookTest.add(..))
[*可以代表所有的访问修饰符 ..可以代表方法的参数]
execution(* spring.aop.BookTest.*(..))
[*可以代表所有的访问修饰符 *(..)可以代表类中所有的方法]
execution(* *.*(..))
[*可以代表所有的访问修饰符 *.*(..)可以代表所有类的所有方法]
execution(* save*(..))
[*可以代表所有的访问修饰符 save*(..)可以代表所有以save开头的方法]
配置切面
配置通知
添加的增强方法
前置增强/通知
后置增强/通知
环绕
异常增强/通知
最终增强/通知
测试结果
创建配置文件,需要AOP的配置文件
打开AOP扫描
创建对象
创建增强目标类
package spring.aop.基于注解的AOP;
//target
public class Book {
public void add() {
System.out.println("addBook");
}
}
配置:创建对象
添加@AspectJ注解到代理类
@Aspect
public class MyBook {
注解
@Aspect
测试执行
效果
配置环境
引入log4j.JAR,配置log4j.properties配置文件,设置日志级别
# Global logging configuration
#ERROR DEBUG
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n