1. 程式人生 > >Spring ioc 常用 詳解

Spring ioc 常用 詳解

rand 通過 prototype epo 外部文件 連接 text efault per

[TOC]

Spring容器

配置對象時默認的單例的
可以設置bean的scope屬性

  1. singleton 單例模式,只會在IOC容器初始化的時候創建bean,並且只會創建一次
  2. prototype 原型模式,在每次獲取bean的時候才會創建bean,並且每次獲取都會創建一個新的對象
  3. session 每個會話共享一個bean
  4. request 每個請求共享一個bean

配置的方式

  • 通過 屬性名 對應 屬性值 進行配置
  • 通過類的構造進行配置
  • 當一個javaBean中包含對像的屬性時 可以通過(ref)引用的方式配置
  • list,map,set
<list>
    <ref bean=
"beanId"/> </list> <set> <ref bean="beanId"/> </set> <map> <entry key="AA" value-ref="b1"/> <entry key="BB" value-ref="b2"/> </map>
  • bean 自動配置
    通過autowire可以實現bran的自動配置
    1. autowire="byName" 要求屬性名與對象Bean的id相同
    2. autowire="byType" 要求自動配置的屬性對象的類型與屬性的類型一致且唯一
  • 配置 Properties

    <property name="properties">
    <props>
        <prop key="driverClassName">oracle.jdbc.driver.OracleDriver</prop>
        <prop key="url">jdbc:oracle:thin:@127.0.0.1:1521:XE</prop>
    </props>
    </property>
註解配置
<context:component-scan base-package="com.yuing.spring1"/><!--開啟自動掃描組建-->
  • @Component 任意的java類
  • @Controller 控制層
  • @Repository DAO層
  • @Service 業務層

配置過濾器

  • exclude-filter 不包含過濾的條件
  • include-filter 包含過濾的條件 (在使用時應先關閉默認的過濾器use-default-filters="false")
  • type有五種類型
aspectj assignable custom regex annotation 根據註解過濾
org.springframework.stereotype.Component //@Component(任意一個類)
org.springframework.stereotype.Repository //@Repository
org.springframework.stereotype.Service //@Service
org.springframework.stereotype.Controller //@Controller

自動註入:@Autowire 標簽貼在對象上 在容器中返回對象
技術分享圖片

<context:component-scan base-package="包名">
    <context:exclude-filter type="過濾的條件類型" expression="條件"/>
</context:component-scan>
<context:component-scan base-package="包名" use-default-filters="false">
    <context:include-filter type="過濾的條件類型" expression="條件"/>
</context:component-scan>

給bean的屬性設置特殊值

  • 設置特殊字符串 "<",">"

    <!-- 在value標簽中的<![CDATA[value]]> 中設置屬性的值 -->
    <property name="propertyName">
    <value><![CDATA[<Java開發>]]></value>
    </property>
  • 設置空置

<property name="propertyName">
    <null/>
</property>

標簽 屬性

  • bean標簽 配置javaBean對象
  • util標簽 聲明(list,map,set,property)
  • p標簽 bean標簽的屬性 p:屬性名="屬性值"
  • context標簽 加載外部文件

  • abstract:將bean的abstract屬性設置為true時,該bean只能作為模板bean,不會被容器初始化

    子bean通過 parent="beanId" 加載模板

bean的生命周期

ClassPathXmlApplicationContext 容器 被初始化時裏面的bean就都被創建ClassPathXmlApplicationContext 銷毀時 bean 也跟著銷毀
bean的屬性

init-method="" :可以指定當bean加載成功後執行一個bean對象中的初始化方法

destroy-method="" :可以指定當bean即將銷毀時 執行一個bean對象中的銷毀的化方法

配置druid連接池 加載properties文件 調用其中的值

  • 加載properties文件
 <context:property-placeholder location="classpath:db.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    <property name="url" value="${url}"/>
    <property name="driverClassName" value="${driverClassName}"/>
</bean>

SPEL:Spring的表達式語言

#{beanId}                  引用其他的bean對象
#{beanId.pro}              引用其他bean對象的屬性值 
#{beanId.methodName()}     調用方法得到返回值
#{田間 ? ‘真的返回值‘ : ‘假返回值‘}      三目運算

工廠Bean (FactoryBean

public class CarFactoryBean implements FactoryBean<Car> {} //以Car類為例
  • 配置的方式
<bean id="car" class="com.hwua.spring02.factory.CarFactoryBean"/>

Bean後置處理器(初始化之前 和初始化之後執行)

配置:

 <bean class="com.hwua.spring02.util.MyPostProcessor"/>

java代碼:

public class MyPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws 
    //參數 o: Bean對象  s: Bean的id
    BeansException {
        System.out.println("MyPostProcessor.Before : "+o+",s:"+s);
        if(o instanceof Book){
            //是book
        }else if (o instanceof Car){
            //是Car
        }
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("MyPostProcessor.After : "+o+",s:"+s);
        return o;
    }
}

java工廠類的配置(了解)

Java代碼

public class StaticCarFactory {

    private static Map<String,Car> carMap = new HashMap<>();

    static {
        Car bmw = new Car();
        bmw.setBrand("BMW");
        bmw.setPrice(9.9);
        Car audi = new Car();
        audi.setBrand("audi");
        audi.setPrice(19.9);
        carMap.put("BMW",bmw);
        carMap.put("audi",audi);
    }

    public static Car createCar(String brand){
        return carMap.get(brand);
    }

}

xml代碼

<!--靜態工廠創建對象不需要實例化工廠類-->
<bean id="car" class="com.hwua.spring02.factory.StaticCarFactory"
      factory-method="createCar">
    <constructor-arg [name="參數名"] value="audi"/>
</bean>

<!--實例工廠需要先實例化工廠類-->
<bean id="carFactory" class="com.hwua.spring02.factory.InstanceCarFactory"/>

<!--使用工廠類創建Car對象-->
<bean id="car1" factory-bean="carFactory" factory-method="createCar">
    <constructor-arg [name="參數名"] value="audi"/>
</bean>

在Java類中使用:

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//創建容器的對象

ac.getBean(Class<T>|"IdString");//獲取javaBean對象 當一個類配置了多個javabean時通過類和id可以鎖定一個JavaBean
@Autowired      //自動裝配(默認是根據class)
@Qualifier("bookServer")    //根據id進行裝配
BookServer bookServer;

實例

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="person1" class="com.yuing.spring1.User">
        <property name="age" value="18"/>
        <property name="name" value="張三"/>
        <property name="book" ref="b1"/>
        <property name="book.name" value="oracle基礎"/>
        <property name="book.price" value="99.8"/>
    </bean>

    <!--簡單的javaBean-->
    <bean id="person2" class="com.yuing.spring1.User">
        <constructor-arg value="李四" name="name"/>
        <constructor-arg value="20" name="age"/>
    </bean>

    <bean id="person3" class="com.yuing.spring1.User">
        <constructor-arg value="李四" index="0"/>
        <constructor-arg value="20" index="1"/>
    </bean>
    <bean id="b1" class="com.yuing.spring1.pojo.Book">
        <property name="name" value="java基礎"/>
        <property name="price" value="3.5"/>
    </bean>

</beans>

Spring ioc 常用 詳解