标签:before pen this none 类型 代理 com bean cut
<!-- 扫描着这包下的注解 --> <context:component-scan base-package="cn.xiaou.domain"></context:component-scan>
1 //将对象注册到容器 2 @Component("s1") 3 /* 4 * @Service("s1") 5 * @Controller("s1") 6 * @Repository("s1") 7 */ 8 /*修改对象的作用范围 9 * @Scope("prototype") 多例 10 * @Scope("singleton") 单例 默认 11 */ 12 @Scope("singleton") 13 public class Student { 14 //值注入,不推荐因为是通过反射Field赋值,破坏来来封装性 15 @Value("zjj") 16 private String name; 17 18 private Integer age; 19 /* 20 * @Resource(name="class1") 手动装配 21 * @Autowired 22 * 自动装配根据类型进行装配 23 * 如果出现多个类型一样的对象,将无法控制注入的是那个对象 24 */ 25 @Resource(name="class1") 26 private Class clazz; 27 28 public Class getClazz() { 29 return clazz; 30 } 31 public void setClazz(Class clazz) { 32 this.clazz = clazz; 33 } 34 public String getName() { 35 return name; 36 } 37 public void setName(String name) { 38 this.name = name; 39 } 40 //值注入推荐使用 41 @Value("18") 42 public void setAge(int age) { 43 this.age = age; 44 } 45 @Override 46 public String toString() { 47 return "Student [name=" + name + ", age=" + age + ", clazz=" + clazz + "]"; 48 } 49 50 @PostConstruct 51 public void init() { 52 System.out.println("我是初始方法"); 53 } 54 @PreDestroy 55 public void destory() { 56 System.out.println("我是摧毁方法"); 57 } 58 }
joinpoint(连接点):目标对象中,所有可以增强的方法
pointcut(切入点):目标对象,已经增强的方法
Advice(通知/增强):增强的代码
Target(目标对象):被代理对象
weaving(织入):将通知应用切入点的过程
Proxy(代理):将通知织入到目标对象之后,形成的代理对象
aspect(切面):切入点和通知
1.动态代理:通过接口代理
2.cglib代理:不用通过接口,而是通过继承实现代理
在Spring中是先判断代理类是否可以通过接口代理如果不行则通过cglib代理
1.导包(4个基本包+aspects切面包+aop包)第三方的jar包(aopalliance和weaver)
2.目标类
public class ProxyDemoImpl implements ProxyDemo{ @Override public void save() { System.out.println("保存中"); } @Override public void query() { System.out.println("查询中"); } @Override public void update() { System.out.println("更新中"); } }
3.准备通知
public class MyAdvice { public void before() { System.out.println("前置通知"); } public void afterRunning() { System.out.println("这是后置通知"); } public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("这是环绕通知前置部分"); Object proceed = pjp.proceed(); System.out.println("这是环绕通知后置部分"); return proceed; } public void afterException() { System.out.println("异常"); } public void after() { System.out.println("这是后置通知"); } }
4.配置进行织入,将通知织入目标对象中
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-4.3.xsd"> <bean name="ProxyDemo" class="cn.xiaou.proxy.ProxyDemoImpl"></bean> <bean name="myAdvice" class="cn.xiaou.proxy.MyAdvice"></bean> <!-- 动态代理配置 --> <aop:config> <!-- 配置切点 --> <aop:pointcut expression="execution(* cn.xiaou.proxy.*DemoImpl.*(..))" id="pc"/> <!-- 对切面进行配置 --> <aop:aspect ref="myAdvice"> <!-- 对前置通知方法配置 --> <aop:before method="before" pointcut-ref="pc"/> <!-- 对后置通知方法配置 如果报错就不执行--> <aop:after-returning method="afterRunning" pointcut-ref="pc"/> <!-- 这是环绕通知,在前后都会执行 --> <aop:around method="around" pointcut-ref="pc"/> <!-- 这是异常通知 --> <aop:after-throwing method="afterException" pointcut-ref="pc"/> <!-- 这是前置通知,无论有无异常都会执行 --> <aop:after method="after" pointcut-ref="pc"/> </aop:aspect> </aop:config> </beans>
标签:before pen this none 类型 代理 com bean cut
原文地址:https://www.cnblogs.com/FlyBlueSky/p/9185451.html