Spring框架學習第二天
阿新 • • 發佈:2018-06-15
sys imp repos 初始 In edi etag con AD
1.使用註解配置Spring
1.導包基本包4個+2個Spring+aop
2.導入新的命名空間context
3.開啟註解掃描功能
<!-- 掃描著這包下的註解 --> <context:component-scan base-package="cn.xiaou.domain"></context:component-scan>
4.在bean類的操作
1 //將對象註冊到容器 2 @Component("s1") 3 /* 4 * @Service("s1") 5 * @Controller("s1") 6 * @Repository("s1")Annotation7 */ 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 }
2.aop
1.aop的名詞學習
joinpoint(連接點):目標對象中,所有可以增強的方法
pointcut(切入點):目標對象,已經增強的方法
Advice(通知/增強):增強的代碼
Target(目標對象):被代理對象
weaving(織入):將通知應用切入點的過程
Proxy(代理):將通知織入到目標對象之後,形成的代理對象
aspect(切面):切入點和通知
2.Spring實現的aop
1.動態代理:通過接口代理
2.cglib代理:不用通過接口,而是通過繼承實現代理
在Spring中是先判斷代理類是否可以通過接口代理如果不行則通過cglib代理
3.Spring動態代理實現
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>
Spring框架學習第二天