天天看點

spring Ioc底層原理

    spring架構是一個輕量級的一站式架構,替代了ejb,面試中遇到問題最多的就是aop和ioc原理(樓主栽了不少次),是以看了一些資料,下面是自己了解的ioc底層原理,特此記錄一下,作為溫習之用(本人菜鳥,有說的不合理的地方,請下方評論

spring Ioc底層原理

    第一步:配置xml配置檔案,配置要建立的對象類          <bean id = "userService" class="com.aaa.UserService"/>     第二步: 建立工廠類,使用dom4j解析配置檔案+反射          //傳回UserService對象的方法          public static UserService getService(){          //1.使用dom4j解析xml檔案           //根據Id值userService ,得到id值對應的class屬性值          String classValue=“第一步中的class屬性值”;          //2.使用反射建立類對象          Class class = Class.forName( classValue );          //建立類對象          UserService service = class.newInstance();           return service;      }

spring Ioc底層原理

下面是aop的實作 首先引入aop命名空間 xmlns: aop =" http://www.springframework.org/schema/aop " xsi :schemaLocation =" http://www.springframework.org/schema/aop                                              http://www.springframework.org/schema/aop/spring-aop.xsd " > <!-- 聲明自動為 spring 容器中那些配置 @aspectJ 切面的 bean 建立代理,織入切面。 激活自動代理功能 --> < aop :aspectj-autoproxy />

    1.注解方式 //定義個切面類 @A spect @Component public class argsAspectDemo {         //定義個切入點。攔截 com. aidongsports下面所有的類          @Pointcut( "execution(* com.aidongsports..*(..))")         public void machArgs(){ }                    //前置通知          @Before(" machArgs() ")          public void before(){          System.out.println("******before advice*****");      }

}

比對參數: //比對任何以find開頭 而且隻有一個Long 參數的方法 @Pointcut("execution(* *..find*(Long) )") public void argsDemo1(){}

//比對任何一個隻有Long參數的方法 @Pointcut("args(Long)") public void argsDemo2(){}

//比對任何以find開頭 而且第一個參數為Long型的方法 @Pointcut("execution(* *..find*(Long,..) )") public void argsDemo3(){}

//比對第一個參數為Long型的方法 @Pointcut("args(Long,..)") public void argsDemo4(){}

execution 表達式 (* com.aaa.service.*.*(..))中幾個通配符的含義:  第一個 * —— 通配所有傳回值類型 第二個 * —— 通配包com.aaa.service下的所有class 第三個 * —— 通配包com.aaa.service下的所有class的所有辦法 第四個 ..—— 通配 方法可以有0個或多個參數 比對注解:

spring Ioc底層原理