spring架構是一個輕量級的一站式架構,替代了ejb,面試中遇到問題最多的就是aop和ioc原理(樓主栽了不少次),是以看了一些資料,下面是自己了解的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; }
下面是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個或多個參數 比對注解: