1. 程式人生 > >Spring框架學習第二天

Spring框架學習第二天

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")
7 */ 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 }
Annotation

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框架學習第二天