spring的ioc和aop是什么 Spring的IOC和AOP解释(2)
spring的ioc和aop是什么
(5)把 Bean 实例传递 Bean 后置处理器的方法 postProcessAfterInitialization
(6)Bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用 Bean 的销毁的方法(需要进行配置销毁的方法)
AOP 是什么?
SpringAOP 的意思是面向切面,利用 AOP 可以对业务逻辑的各个部分进行隔离,减少业务逻辑各部分之间的耦合度,提高程序可重用性。
Spring AOP 是在 Aspecj 基础上。
AOP 术语
连接点:可以被增强的方法
切入点:真正增强的方法
通知:真正增强的代码逻辑
切面:将通知应用到切入点的过程
AOP 的应用场景
1)自定义日志一般用 @Around
2)性能统计
3)事务管理 @Transactional 代理模式,增强方法。
4)权限管理,日常用的登录判断管理员和用户,自定义注解 + AOP 即可实现。
实现 AOP 的两种方式
1)JDK 动态代理(有接口的情况)
2)CGLIB 动态代理(没有接口的情况)
SpringBoot 1 和 Spring 5 默认用 JDK 动态代理
SpringBoot 2 开始默认使用 CGLIB 动态代理,原因是没有接口依然不会报错,性能略高于 JDK 动态代理。
JDK 动态代理示例代码
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类的代理对象
UserDaoImpl userDao = new UserDaoImpl();
Class[] interfaces = {UserDao.class};
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
int result = dao.add(1, 2);
System.out.println("result = " + result);
}
}
class UserDaoProxy implements InvocationHandler {
//1.把创建的是谁的代理对象,把谁传递过来
//有参数构造器
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前:
System.out.println("方法之前执行...." + method.getName() + ":传递的参数..." + Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行..." + obj);
return res;
}
}
AspectJ 定义的通知类型和返回顺序
- 前置通知
- 后置通知
- 返回通知
- 异常通知
- 环绕通知
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类的代理对象
UserDaoImpl userDao = new UserDaoImpl();
Class[] interfaces = {UserDao.class};
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
int result = dao.add(1, 2);
System.out.println("result = " + result);
}
}
class UserDaoProxy implements InvocationHandler {
//1.把创建的是谁的代理对象,把谁传递过来
//有参数构造器
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前:
System.out.println("方法之前执行...." + method.getName() + ":传递的参数..." + Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行..." + obj);
return res;
}
}Spring 4 和 5 返回顺序的区别,Spring 5 将最终通知真正放到了最后。
Spring4版本
(1).正常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.环绕之后通知
5.After最终通知
6.AfterReturning 后置通知
(2).异常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.After最终通知
5.AfterThrowing 异常通知
Spring5版本
(1).正常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.环绕之后通知
5.AfterReturning后置通知
6.After最终通知
(2).异常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.AfterThrowing异常通知
5.After最终通知
上述的关于spring的ioc和aop是什么的详细方法介绍,大家作为一个参考建议。
相关阅读
-
分布式架构下 Session共享有什么方案
一篇关于分布式架构下的话题,接下来一起来看看吧。 采用无状态服务,抛弃session 存入cookie(有安全风险) 服务器之间进行 Session 同步,这样可以保证每个服务器上都有全部的 Session 信息,
-
Redis的数据过期策略是什么
本文为您带来的是Redis的数据过期策略是什么IT技巧方面的经验,接下来IT袋网小编为大家介绍。 Redis使用数据过期策略来自动删除已经过期的数据,以释放内存空间并确保数据的新鲜性。 Red
-
什么是虚拟线程? 虚拟线程的概念与解析
关于这个什么是虚拟线程的相关话题,接下来小编为网友介绍。 与平台线程一样,虚拟线程也是 java.lang.Thread 的一个实例对象。但是,虚拟线程并不依赖于特定的操作系统线程。 虚拟线程底层
-
DNS协议在哪一层 dns服务器工作在哪一层
dns服务器工作在哪一层()。 A.传输层 B.网络层 C.数据链路层 D.应用层 正确答案 : D.应用层 此题解析: DNS协议均位于OSI或TCP/IP参考模型的应用层。 DNS域名系统主要负责记录互联网中主机名和该


