1. 程式人生 > 資訊 >宇宙大爆炸會不會重複發生

宇宙大爆炸會不會重複發生

Spring5

1.前身:interface21

2.發明者:Rod Johnson(悉尼大學 雙學位 音樂學 計算機學)

3.輕量級、防入侵

4.優點:輕量級的控制反轉(IOC)和麵向切面程式設計(AOP)

5.Spring框架主要由七部分組成,分別是Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

6.弊端:“配置地獄”

一、作用域(scope)

Scope

二、動態代理

  • 動態代理和靜態代理角色一樣

  • 動態代理的代理類是動態生成的,不是我們直接寫好的!

  • 動態代理分為兩大類:基於介面的動態代理,基於類的動態代理

    • 基於介面---JDK動態代理

    • 基於類:cglib

    • java位元組碼實現:javasist(東京工業大學的數學和計算機科學系的 Shigeru Chiba (千葉 滋)所建立的。它已加入了開放原始碼JBoss 應用伺服器專案,通過使用Javassist對位元組碼操作為JBoss實現動態"AOP"框架。)

    兩個類:Proxy:代理,InvocationHandler:呼叫處理程式並返回結果(呼叫處理程式)

三、依賴

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
 </dependencies>

四、建立程式

  • 匯入依賴,建立Model專案

  • 建立實體類

  • 配置xml檔案

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="..." class="...">  
            <!-- collaborators and configuration for this bean go here -->
        </bean>
    
        <bean id="..." class="...">
            <!-- collaborators and configuration for this bean go here -->
        </bean>
    
        <!-- more bean definitions go here -->
    
    </beans>
    
  • 建立測試類

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml檔名");
    類名 bean = context.getBean("id名",強轉類);
    System.out.println(bean.toString());
    

五、注入物件

  • 在Xml檔案中建立

    <bean id="one" class="com.dragon.pojo.Hello">
        <property name="name" value="first spring"/>
    </bean>
    <bean id="two" class="com.dragon.pojo.Hello">
    	<property name="hello" ref="one"/>
    </bean>
    

六、註解方式IOC/DI

  • IOC---控制反轉
  • DI---依賴注入

七、自動裝配Bean

  1. 顯式裝配

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="cat" class="com.dragon.Catt"/>
        <bean id="dog" class="com.dragon.Dog"/>
        <bean id="three" class="com.dragon.Person">
            <property name="name" value="Dawson"/>
            <property name="cat" ref="one"/>
            <property name="dog" ref="two"/>
        </bean>
    </beans>
    
  2. Java裝配

  3. 隱式裝配

    • byName
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="cat" class="com.dragon.Catt"/>
        <bean id="dog" class="com.dragon.Dog"/>
        <bean id="three" class="com.dragon.Person" autowire="byName">
            <property name="name" value="Dawson"/>
    <!--    <property name="cat" ref="one"/>
            <property name="dog" ref="two"/>
    -->
        </bean>
    </beans>
    

    byName會自動在容器上下文中找與set後的名稱對應的beanId

    • byType
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="cat" class="com.dragon.Catt"/>
        <bean id="dog" class="com.dragon.Dog"/>
        <bean id="three" class="com.dragon.Person" autowire="byType">
            <property name="name" value="Dawson"/>
    <!--    <property name="cat" ref="one"/>
            <property name="dog" ref="two"/>
    -->
        </bean>
    </beans>
    

    byType會自動在容器上下文中找與自己物件屬性型別相同的類與之對應

八、註解實現自動裝配

jdk1.5支援註解,spring2.5支援註解

使用註解須知:

  1. 匯入約束:context約束
  2. 配置註解的支援:<context:annotation-config/>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    <bean id="person" class="com.dragon.Person"/>
    <bean id="dog" class="com.dragon.Dog"/>
    <bean id="cat" class="com.dragon.Cat"/>
</beans>
  • @Autowired
    • 可使用在屬性或set方法上
    • 可以將set方法去除
    • 當名字或型別有一個相同,則可以在xml檔案中更改id對應的值,反之不可以
    • 如果有上述情況,則可以將@Autowired和@Qualifier(value="dog222")配合使用
  • @Resource
    • @Autowired性質差不多,但不可以用在set上
    • 先找byName再byType,最後找不到就報錯
    • 當然也可以傳參,例如@Resource(name="dog111")
  • 小結
    • 二者均是用來自動裝配的,都可以放在屬性欄位上
    • @Autowired預設通過byType方式,如果有多個型別相同的再按照byName
    • @Resouce預設通過byName方式,如果找不到名字,則通過byType實現,如果二者都找不到,就報錯

九、使用註解開發

在使用spring4之後,要使用註解開發,必須要保證AOP的包匯入了

  • 建立XML檔案

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
        <!--掃描指定包下的註解並生效-->
        <context:component-scan base-package="com.dragon.pojo"/>
        <context:annotation-config/>
    </beans>
    
  • 在實體類中使用以下註解

    • @Component:註冊類到IOC容器

    • @Resource:javax的自動裝配

    • @Autowired:spring的自動裝配

    • @Value:給屬性賦值

    • @Qualifier :與@Autowired配合使用

十、AOP

​ AOP(Aspect Oriented Programming):面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護。Aop是OOP的延續。是函數語言程式設計的一種衍生泛型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合性降低,提高程式的可重用性,同時提高了開發效率。

注意,在pom.xml中匯入依賴

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.8</version>
    </dependency>
</dependencies>

1.使用SpringAPI介面

  • 建立介面

    public interface UserService {
        public void add();
        public void delete();
        public void update();
        public void select();
    }
    
  • 介面實現類

    public class UserServiceImpl implements UserService{
        @Override
        public void add() {
            System.out.println("增加了一個使用者");
        }
        @Override
        public void delete() {
            System.out.println("刪除了一個使用者");
        }
        @Override
        public void update() {
            System.out.println("更改了一個使用者");
        }
        @Override
        public void select() {
            System.out.println("查找了一個使用者");
        }
    }
    
  • 建立日誌

    • 執行之前
    import org.springframework.aop.MethodBeforeAdvice;
    import java.lang.reflect.Method;
    
    public class Log implements MethodBeforeAdvice {
        //method:要執行的目標物件的方法
        //args:引數
        //target:目標物件
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println(target.getClass().getName() + "的" + method.getName() + "被執行了");
        }
    }
    
    • 執行之後
    import org.springframework.aop.AfterReturningAdvice;
    import java.lang.reflect.Method;
    
    public class AfterLog implements AfterReturningAdvice {
        @Override
        public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
            System.out.println("執行了"+method.getName()+"方法,返回結果為"+returnValue);
        }
    }
    
  • 配置xml檔案

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            https://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--註冊bean-->
            <bean id="log" class="com.dragon.log.Log"/>
            <bean id="user" class="com.dragon.service.UserServiceImpl"/>
            <bean id="afterLog" class="com.dragon.log.AfterLog"/>
        <aop:config>
            <!--切入點:expression:表示式-->
            <aop:pointcut id="pointcut" expression="execution(* com.dragon.service.UserServiceImpl.*(..))"/>
            <!--執行環繞-->
            <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <!--此處pointcut-ref為切入類-->
            <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
        </aop:config>
    </beans>
    
  • 測試類

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class Test{
        @Test
        public void t0(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService user = context.getBean("user",UserService.class);
            user.add();
        }
    }
    

2.自定義類實現

與方式一不同的地方為xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="user" class="com.dragon.service.UserServiceImpl"/>
    <!--自定義類-->
    <bean id="diy" class="com.dragon.diy.DiyPoint"/>
    <aop:config>
        <!--自定義切面,ref要引入的類-->
        <aop:aspect ref="diy">
            <!--切入點-->
            <aop:pointcut id="point" expression="execution(* com.dragon.service.UserServiceImpl.*(..))"/>	<!--通知-->
            <aop:before method="before" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>
</beans>

方式二並沒有方式一強大

3.註解實現

  • 建立一個業務介面

  • 實現該介面的類新增如下註解

    import org.springframework.stereotype.Component;
    
    @Component("userServiceImpl")
    public class UserServiceImpl implements UserService{
        public void add(){
            System.out.println("使用者新增");
        }
    }
    
  • 編寫切面類

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class AnnoPoint {
        @Before("execution(* com.dragon.service.UserServiceImpl.*(..))")
        public void before(){
            System.out.println("===方法執行前===");
        }
    }
    

    @Before("execution(* com.dragon.service.UserServiceImpl.*(..))"),注意此句是切到指定類中的某個方法中

  • 配置applicationContext.xml檔案

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--掃描指定包下的註解並生效-->
        <context:component-scan base-package="com.dragon.diy"/>
        <context:component-scan base-package="com.dragon.service"/>
        <context:annotation-config/>
        <!--找到被註解了的切面類,進行切面配置-->
        <aop:aspectj-autoproxy/>
    </beans>
    
  • 利用測試類正常測試

注意事項,在配置xml檔案時,三行程式碼缺一不可

    <context:component-scan base-package="com.dragon.diy"/>
    <context:component-scan base-package="com.dragon.service"/>
    <context:annotation-config/>
    <!--找到被註解了的切面類,進行切面配置-->
    <aop:aspectj-autoproxy/>