Spring(DI,AOP) 理解(一)

  • 2020 年 4 月 17 日
  • 筆記

感覺自己的spring理解的不好.所以重新開始學習.

這篇文章主要是來理解DI(依賴注入),Aop(切面)

一.DI(依賴注入,這裡沒有涉及到注釋.只是用xml文件和Bean的方法來註冊pojo,)

   依賴注入就是將創建bean對象的權利交給spring框架(控制反轉) 然後用Applicationcontext.getBean()  來獲取對象.

   容器:spring容器創建對象,管理對象,並負責管理對象的生命周期.  容器有兩種 BeanFactiory   ..ApplicationContext ..多的就不解釋了,BeanFactiory 比較low,這裡使用ApplicaitonContext

   ApplicaitonContext:

         1  FileSystemXmlApplicationContext:以基於文件系統的XML配置文件創建ApplicationContext實例。

         2  ClassPathXmlApplicationContext:以類加載路徑下的XML配置文件創建的ApplicationContext實例

         3    XmlWebApplicationContext:從web應用下的一個或者多個xml配置文件加載創建ApplicationContext實例

         4   AnnotationConfigApplicationContext 從一個或者多個基於java的配置類中加載Spring ApplicaitonContext實例

         5    AnnotationConfigWebApplicationContext 基於一個或者多個java的配置類來創建spring web 的應用上下文

 二. Aop :面向切面編程.(將復用性很強的模塊抽離出來,然後通過配置,將抽離出來的模塊(比如日誌模塊),覆蓋到其他需要日誌模塊的服務上)

       一個項目假設有講師服務,學生服務,計費服務…….還有日誌模塊,安全模塊,事務模塊

       講師服務,學生服務,計費服務 每一個服務都需要與日誌模塊,安全模塊,事務模塊 進行耦合…..如果這個樣子,,每一個服務裏面的代碼不能夠專註於解決本服務的問題.需要調用日誌模塊,安全模塊,事務模塊的代碼.

       這樣,代碼的復用性會很低,耦合性很高.

 創建一個Person類…裏面有一個doSomething方法

package com.start.demo;
/**
 * 男孩,女孩,工程師,程序員....
 */
public class Person {
    private String name;
    private int age;
    private Play play;

    public Person(Play p) {
        this.play = p;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    void doSomething() {
        System.out.println(" we can  play " + play.getType() +"together");
    }
}

   創建一個Play類  type 表示可以做的事情

package com.start.demo;

/**
 * 各種活動,,玩遊戲,讀書,看電視.....
 */
public class Play {
    private String type="computer game";

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

    測試Aop的一個類

package com.start.demo;

/**
 * 這個類是用來測試Aop.在切點之前,之後,分別調用對應的方法
 */
public class Asker {
    private String name;
     void doSomethingBefore(){
        System.out.println("what can we do ");
    }
    void  doSomethingAfter(){
        System.out.println("that's fine");
    }
}

 

裝配bean的xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="//www.springframework.org/schema/aop"
       xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd
        //www.springframework.org/schema/aop //www.springframework.org/schema/aop/spring-aop.xsd">
     <!--裝配bean-->
    <bean id="person" class="com.start.demo.Person">
        <constructor-arg ref="play"/>
    </bean>
    <bean id="play" class="com.start.demo.Play"/>
    <bean id="asker" class="com.start.demo.Asker"/>
    <aop:config>
        <aop:aspect ref="asker">
            <!-- pointcut 的id 不能與 配置切點bean的id一樣了,會報錯.-->
            <aop:pointcut id="personPointcut"
                          expression="execution(* *.doSomething())"/><!--execution(* * .doSomething(..)) 要是有參數,需要在方法體裏面加 ..-->
            <aop:before pointcut-ref="personPointcut" method="doSomethingBefore"/>
            <aop:after pointcut-ref="personPointcut" method="doSomethingAfter"/>
        </aop:aspect>
    </aop:config>

</beans>

  用javaBean來裝配對象

package com.start.confBean;

import com.start.demo.Person;
import com.start.demo.Play;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PersonConf {
    @Bean
    public Person person() {
        return new Person(play());
    }

    @Bean
    public Play play() {
        return new Play();
    }
}

測試Main類

   

package com.start.demo;

import com.start.confBean.PersonConf;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext appcontext = new ClassPathXmlApplicationContext("beans.xml");    //從beans.xml 文件獲取ApplicaitonContext 
//        AnnotationConfigApplicationContext annotationApplicationContext = new AnnotationConfigApplicationContext(PersonConf.class);//PersonConf.java 文件獲取ApplicaitonContext 
//        Person person1 = annotationApplicationContext.getBean(Person.class);  //獲取bean ,直接指定Bean 為Person
//        Person person = (Person) appcontext.getBean("person");//獲取bean   person 為配置文件裏面的 id
        Person pers = (Person) appcontext.getBean("person");
        pers.doSomething();
    }
}

這些代碼雖然很簡單,卻讓我認識清楚了DI和Aop的作用