Spring ioc与aop的理解
admin
2023-08-30 01:25:17
0次

Spring IOC(控制反转,也叫反转) 概念:将创建对象的过程交给Spring容器去处理,学名叫:控制反转也对反转,
要理解IOC就要解决下边的问题
“谁控制谁?控制什么?为何是反转(有反转就有正转)?哪些方面反转了”
答:
谁控制谁?控制什么?,在传统的开发中,我们是通过在对象内部new进行创建对象,是程序主动去创建依赖对象,而IOC是有专门容器来创建这些对象,由IOC容器来控制对象的创建,“谁控制谁”,就是IOC容器控制对象,“控制什么”主要控制了外部资源的获取
为何是反转?哪些方面反转了?,传统应用程序是由我们自己在对象中主动控制去获取依赖对象,也就是正转,而反转就是容器来帮我们创建及注入依赖对象,为何是反转,因为由我们容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,哪些方面反转了?依赖对象反转了
操作就是在applicationContext.xml文件中,配置bean


//在Test测试中,通过下面方式调用bean,完成对象的创建 ApplicationContext ac=new ClassPathXmlApplication("applicationContext.xml"); //根据bean的id查找到对象 //默认用构造器创建实例对象 UserDao userdao1=(UserDao)ac.getBean("userDao"); //用静态工厂方法创建实例对象 UserDao userdao2=(UserDao)ac.getBean("userDao2");

applicationContext.xml配置文件

//静态工厂方法 public class UserFactory { // 静态方法 public static User getUser1() { return new User(); } }

//实例工厂方法 public class UserFactory { //普通方法 public User getUser2() { return new User(); } }

DI 依赖注入(三种方式注入)
1、构造器注入
private UserDao userdao; public UserDao(UserDao userdao){ this.userdao=userdao; }

在applicationContext.xml文件中配置

2、set方式注入 在UserService中注入UserDao
private UserDao udao; public UserDao getUserDao() { return uDao; }public void setUserDao(UserDao userDao) { this.uDao = userDao; }

在applicationContext.xml中配置

3、命名空间注入 为了简化setter方法,之前通过进行注入,p命名使用属性,。不过这种方法在企业级开发中用的比较少。
如图所示,在实现p命名空间之前,要做一点事情。前面p必选,后面p可以改成别的名字。
[外链图片转存失败(img-nBKTaoLG-1568896907332)(F:\实训\前端\Center)]
AOP(面向切面编程) 那什么是面向切面编程呢?
答案是面向切面编程是纵向的的编程,比如我们要在程序A和程序B进行同样的日志记录,传统方法,我们需要在程序A和程序B中分别加入相关的日志记录操作,这样做,会让程序显得更加不够灵活,事务中杂着日志,让代码可读性低,那怎么解决呢?就用AOP只写一遍代码,程序A和程序B共用这一段代码不改动原代码。
在实际开发中,比如查询,删除,都需要记录日志、异常处理的操作,AOP把所有共同的代码都剥离出来,单独放在某个类中进行集中管理,在具体运行中,由容器进行动态织入这些代码。
AOP主要一般应用于签名验签,参数校检,日志记录,事务控制等。
Spring AOP的底层实现的两种方式: 一种是JDK动态代理,另一种是Cglib方式
JDK动态代理 有个限制:就是它只能为接口代理实例,而对于接口没有实现类的,就不起作用了
Cglib方式 可以为一个类创建一个创建一个子类,在子类中采用方法拦截的技术,拦截所有父类方法的调用并编写自己的拦截事务处理
两者区别: jDK动态代理是面向接口的
Cgilib动态代理是通过字节码底层继承要代理的类来实现的
那Spring是采用那一种方式进行AOP事务处理的呢?
  1. 如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作
  2. 如果要被代理的对象不是个实现类(比如是个接口),那么Spring会强制使用Cglib来实现动态代理
教科书般的理论讲得差不多了,下边来看看这两种方式的实现吧
JDK动态代理 [外链图片转存失败(img-HqP8MOMy-1568896907333)(F:\实训\前端\1568865687634.png)]
UserDaoImpl类实现了UserDao接口,需要对
UserDaoImpl目标类进行动态代理,简单说就是要有实现类,不然无效
public class MyJDKProxy { /** * 采用JDK的动态代理来实现对一个类的增加 * 只能针对实现接口的类进行增强,如果目标类没有实现接口则无效 */ private Object obj; public MyJDKProxy(Object object){ this.obj=object; }/** * newProxyInstance(用哪个类加载器去加载代理对象,动态代理类需要实现的接口,动态代理方法在执行时, * 会调用h里面的invoke方法去执行); * @return */ public Object greateProxy(){ Object proxy= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("findAll".equals(method.getName())){ System.out.println("进行日志记录!!"); return method.invoke(obj,args); } return method.invoke(obj,args); } }); return proxy; } }

CGlib方式 这种方式是为目标类创建一个子类,进行代理
public Object createProxy(){ // 通过CGLIB动态代理获取代理对象的过程 Enhancer enhancer = new Enhancer(); // 设置enhancer对象的父类 enhancer.setSuperclass(obj.class); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { if("findAll".equals(method.getName())){ System.out.println("cglib记录日志!!!"); return methodProxy.invokeSuper(proxy,objects); } return methodProxy.invokeSuper(proxy,objects); } }); Object proxy=enhancer.create(); return proxy; }

AOP涉及名词
  • 切面(aspect):当使用@Aspect注解修饰的类,就能被AOP容器识别为切面
    @Aspect @Component("myLog")

  • 通知(Advice):切面的具体实现,就是要给目标对织入的情情,以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before),后置通知(After)、异常通知(AfterThrowing)、后置、后置通知增强(AfterReturning)、环线通知(Around)
  • 【Spring ioc与aop的理解】切入点(Pointcut):用于定义通知应该切入到哪些点上,这种精确的匹配是由节入点的正则表达式来定义的
    //@Pointcut声明一个切入点,范围为com.mooc.service.impl包下的findAll()方法 @Pointcut("execution(* com.mooc.service.impl.*.findAll(..))") public void pointCut(){ System.out.println("切面"); } @Before("pointCut()")//前置通知 public void before(JoinPoint joinPoint){ System.out.println("前置通知!!"); } @After("pointCut()")//后置通知 public void after(JoinPoint joinPoint){ System.out.println("后置通知!!"); } @AfterReturning(value = "https://www.it610.com/article/pointCut()",returning ="obj") public void afterruning(Object obj){ System.out.println("后置增强"+obj); } @AfterThrowing(value = "https://www.it610.com/article/pointCut()",throwing = "e") public void afterThrowing(Throwable e){ System.out.println("异常"+e.getMessage()); } @Around("pointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { System.out.println("前置环绕"); Object obj=point.proceed(); System.out.println("后置环绕"); return obj; }

    • 目标对象(Target):那些即将切入切面的对象,就比如上表中的com.mooc.service.impl包下的UserServiceImpl类对象,等待切入
    • 代理对象(Proxy):可以简单理解为为目标对象加上共有的功能,比如对目标类进行日志检查,

相关内容

热门资讯

大浪淘金APP黑幕揭秘:内盘操...   大浪淘金APP平台最隐蔽的黑幕,在于其完全封闭的内盘交易系统。这个看似与国际市场接轨的交易平台,...
告别固定工资实现财富自由?一品...   普通投资者被广告宣传诱导,注册就送现金,充值返现金券等等这些宣传方式,都是在引流到平台开户,不怕...
哈易购APP打着现货交易幌子搞...   网络上各类白银、铂金等贵金属投资广告铺天盖地,不少平台以"现货交易"为名,暗中却从事着非法期货交...
5元起投!高额收益?中国白银、...   上海华通白银国际交易中心有限公司(以下简称“华通白银国际”)打着“白银、铂金现货订购”的旗号,实...
"九州订购APP、起...   近年来,贵金属投资热度持续攀升,但乱象也随之而来。一些不法分子趁机搭建虚假交易平台,打着"低门槛...
坚锅淘金APP投资者频繁爆仓亏...   坚锅淘金APP对外宣称是贵金属现货交易平台,日常出入金看似畅通无阻,给人一种合规运营的假象。但事...
斗金订购APP“5元订购现货”...   斗金订购APP“5元订购现货”骗局揭秘:充值易、回本难,越陷越深!  许多投资人在未核实平台合规...
贵金属APP乱象曝光:&quo...   当前市场上部分贵金属类APP未取得正规交易资质,涉嫌误导消费者参与白银、铂金等商品的非合规交易!...
华通白银、银宝街APP被指虚假...   警惕现货白银投资陷阱:上海华通白银背后的平台涉嫌非法期货交易  近年来,各类现货白银交易平台以“...
充值送300,月入过万?别被量...   如今,网络上充斥着大量未经批准的贵金属及其他产品订购交易平台。这些平台普遍缺乏合法经营资质,却将...
鑫汇智投APP贵金属非法期货、...   鑫汇智投APP贵金属非法期货、人为控盘,大量投资者遭恶意收割  鑫汇智投APP长期以“低门槛、高...
矅光智策APP非法贵金属交易骗...   不少投资人在矅光智策APP上进行贵金属交易后出现了严重亏损。许多人在下载该平台时,根本不清楚其是...
飞鸽订购APP非法期货交易骗局...   飞鸽订购APP非法期货交易骗局,很多投资者根本没搞懂规则就盲目充值,买涨买跌跟买cai票一样!平...
天龙白银APP被操控的非法期货...   中小投资者在网络平台参与商品现货订购交易,表面看似合规合法,实则暗藏诸多难以察觉的风险。商品现货...
下载送试玩金?千万别碰!带你揭...   当前,许多贵金属APP交易平台正采用欺诈性营销手段。它们通过抖音等短视频平台,以“5元起投”“充...
泡泡淘金APP骗局:打着&qu...   泡泡淘金APP骗局:打着"商品订购"幌子,实则非法期货收割投资者!投资需谨慎,切勿轻信“高额回报...
南商云购APP虚假电子盘背后的...   南商云购是虚假电子盘吗?它是否具备合规的交易资质?这个曾经的"现货电子盘"如今摇身一变,披上了"...
警惕"祥龙订购&qu...   祥龙订购APP、掌上银牛APP等平台背后的运营方——四川禄宏商品现货市场有限公司,仅具备现货交易...
中国白银、华银:虚假宣传、后台...   中国白银APP宣称是上市公司“中国白银集团”与“上海华通白银国际交易中心”旗下的现货交易平台,提...
起底“优品订购”APP非法期货...   “优品订购”APP根本不具备任何合法的交易资质。其背后的运营方仅凭随便注册一家公司、开发一款交易...