1. 程式人生 > >ssm--spring2

ssm--spring2

1.spring依賴注入
 1.依賴注入的含義: Dependency Injection
	通過控制反轉(IOC),將物件的建立交給了spring容器來管理後,物件也應該交給spring容器來維護,即:由spring容器來對物件進行賦值。在一個bean物件中注入另外一個bean物件時,這兩個bean物件都必須被spring容器管理。

 2.建構函式注入:
	使用類中的建構函式,給成員變數賦值。通過配置的方式,讓spring框架來為我們注入。
	2.1要求:類中需要提供一個對應引數列表的建構函式。
public class AccountServiceImpl implements IAccountService{
	private String name ;
	private Integer age;
	private Date date;
    public AccountServiceImpl(String name,Integer age, Date date){
		this.name = name ;
		this.age = age ;
		this.date = date ;
    }
	public void setXxx(){ ... }
}
<!--使用帶參建構函式對bean物件的屬性賦值-->
<bean id="accountServiceImpl" class="com.baidu.service.impl.AccountServiceImpl"> <consrtuctor-arg type="java.lang.String" value="張三"></consrtuctor-arg> <constructor-arg index="1" value="23"></constructor-arg> <constructor-arg name="date" ref="now"></constructor-arg
>
</bean> <!--配置Date物件--> <bean id="now" class="java.util.Date"></bean> <!--指定引數--> type:指定引數在建構函式中的資料型別,如果出現多個相同資料型別,就按照引數的排序依次賦值 index:指定引數在建構函式引數列表的索引位置,從0開始 name:指定引數在建構函式中的名稱,對對應名稱的屬性賦值,推薦使用 <!--注入值--> value:它能賦的值是普通資料型別(17種) ref:它能賦的值是其他bean型別,必須得是在配置檔案中配置過的bean,ref(refid)指定bean標籤的id 3.set方法注入(推薦使用) 要求:在類中提供需要注入成員的set方法。 <!--使用set方法對bean物件的屬性賦值-->
<bean id="accountServiceImpl" class="com.baidu.service.impl.AccountServiceImpl"> <property name="name" value="張三"></property> <property name="age" value="23"></property> <peoperty name="date" ref="now"></peoperty> </bean> <!--指定引數--> name:指定引數在set方法中的名稱,對應名稱的屬性賦值 <!--注入值--> value ref 用法同上 4.set方法注入集合屬性 用法:給類中的集合成員傳值,它用的也是set方法注入的方式,只不過變數的資料型別都是集合。 public class AccountServiceImpl implements IAccountService { private String[] myStrs; private List<String> myList; private Set<String> mySet; private Map<String,String> myMap; private Properties props; public void setXxx(){ ... } } <!--使用set方法注入集合屬性--> <bean id="accountServiceImpl" class="com.baidu.service.impl.AccountServiceImpl"> <!--單列集合--> <property name="myStrs"> <array> <value>aaa</value> <value>bbb</value> </array> </property> <property name="myList"> <list> <value>ccc</value> </list> </property> <property name="mySet"> <set> <value>ddd</value> </set> </property> <!--雙列集合--> <property name="myMap"> <map> <entry key="aaa" value="bbb"></entry> <entry key="ccc"> <value>ddd</value> </entry> </map> </property> <property name="props"> <props> <prop key="aaa">bbb</prop> </props> </property> </bean> 注意: 1.在注入集合資料時,只要結構相同,標籤可以互換。即:<array></array> = <list></list> = <set></set> 但是set標籤和set集合有去重的效果, array和list沒有。 2.當依賴注入時,無論使用帶參構造注入還是set注入,當引數型別是普通資料型別時,注入值用value屬性;當引數型別是集合型別時,property標籤上只需要指定name屬性,再在標籤體內包裹集合標籤指定值;當引數是其他bean型別時,使用ref指定引用的物件id來注入值
2.基於註解的 IOC 配置
1.bean.xml中的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
	
    <!--告知spring容器,需要掃描註解配置的包,掃描以下註解:
	@Component/@[email protected]/@Repository-->
    <context:component-scan base-package="com.baidu">
    </context:component-scan>
</beans>

2.2常用註解
2.2.1用於建立bean物件的註解,相當於: <bean id="" class="">,作用於ElementType.TYPE
    @Component
作用:把資源交給Spring容器來管理。相當於在xml中配置一個bean。
屬性:value:指定bean的id。如果不指定value 屬性,預設bean的id是當前類的類名,首字母小寫。 
    @Controller: 一般用於表現層的註解。
    @Service: 一般用於業務層的註解。
    @Repository: 一般用於持久層的註解。
    他們三個註解都是@Component的衍生註解,他們的作用及屬性都是一模一樣的。
他們只不過是提供了更加明確的語義化。
    
2.2.2用於注入資料的,相當於: <property name="" ref=""><property name="" value=""> ,
不需要set方法,底層會利用反射自動生成setter,作用於ElementType.Field
    <!--只能注入其他bean型別-->
    @Autowired	<!--Spring提供-->
    @Qualifier(value="id")	<!--Spring提供-->
    @Resource(name="id") <!--JDK提供-->
    
 @Autowired作用:先自動按照資料型別注入,再按照變數名稱注入(將變數名作為bean的ID),還是不能唯一匹配就報錯。當使用註解注入屬性時,set方法可以省略。它只能注入spring容器中的其他bean型別。
    
 @Qualifier作用:解決注入迷失,在自動按照型別注入的基礎之上,再按照Bean的id注入。它在給field注入時不能獨立使用,必須和@Autowired 一起使用;但是給method引數注入時,可以獨立使用。
屬性:value:指定 bean 的 id。 
    
@Resource(不是Spring的註解,是jdk自帶的註解)作用:直接按照Bean的id注入。它也只能注入其他 bean 型別。
屬性:name:指定bean的id。
如果不指定name屬性,預設先根據byName來匹配,再根據byType來匹配
    
    <!--注入普通資料型別和el表示式結果-->
    @Value 
作用:注入普通資料型別(17種)和spring的EL表示式結果,@Value=("張三"),@Value("${username}")
屬性:value:用於指定值。
    
2.2.3用於改變作用範圍的,相當於: <bean id="" class="" scope="">,作用於ElementType.TYPE
    @Scope  一般不配置,採用預設的單例
作用:指定 bean 的作用範圍。
屬性:value:指定範圍的值。
取值:singleton(Spring預設的) prototype request session globalsession 
    
2.2.4和生命週期相關的,相當於:<bean id="" class="" init-method="" destroy-method=""/>,作用於ElementType.METHOD 
    @PostConstruct 初始化方法,物件建立後呼叫,相當於init-method
    @PreDestroy	銷燬方法,物件銷燬前呼叫,相當於destroy-method
 
2.2.5其他註解
    1.告知spring當前類是一個註解配置類,相當於bean.xml
    @Configuration 作用於ElementType.TYPE
作用:用於指定當前類是一個spring配置類, 當建立容器時會從該類上載入註解。獲取容器時需要使用
new  AnnotationConfigApplicationContext(有@Configuration 註解的類.class)。
屬性:value:用於指定配置類的位元組碼,預設是當前類的位元組碼
    
    2.告知spring容器需要掃描的包,相當於<context:component-scan base-package="com.baidu"/>
    @ComponentScan 作用於ElementType.TYPE
作用:用於指定spring在初始化容器時要掃描的包,開啟註解配置,可以掃描子包。 
屬性:basePackages:用於指定要掃描的包。和該註解中的value屬性作用一樣。
@ComponentScan(basePackages="com.baidu") / (value="com.baidu") 
    
   3.使用例項工廠建立物件
    @Bean 作用於ElementType.Method
作用:該註解只能寫在方法上,表明使用此方法建立一個物件,並且放入 spring 容器。通常使用這個註解建立一些由JDK提供的物件,比如DataSource,來交給spring管理
屬性:name:給當前@Bean 註解方法建立的物件指定一個名稱(即 bean 的 id)。 
特殊用法: @Bean("runner")
    public QueryRunner createQueryRunnere( @Qualifier("dataSource")DataSource ds ){ ... }
使用@Bean註解建立物件時,如果方法需要引數,會自動在spring容器中尋找,相當於預設DataSource上有一個@Autowired註解,如果注入迷失,可以使用@Qualifier註解找回
    
   4.匯入properties配置檔案 作用於ElementType.TYPE
    @PropertySource
作用:用於載入.properties 檔案中的配置。例如我們配置資料來源時,可以把連線資料庫的資訊寫到properties 配置檔案中,就可以使用此註解指定 properties 配置檔案的位置。
屬性:value[]:用於指定 properties 檔案位置。如果是在類路徑下,需要寫上 classpath:
eg: @PropertySource("classpath:jdbcConfig.properties")
相當於:<context:property-placeholder location="classpath:jdbcConfig.properties"/>
    
   5.匯入其他配置檔案的配置資訊 
	@Import 
作用:用於匯入其他配置類,在引入其他配置類時,可以不用再寫@Configuration 註解。當然,寫上也沒問題。
屬性:value[]:用於指定其他配置類的位元組碼。
eg: @Import({JdbcConfig.class})
@Configuration
@ComponentScan("com.baidu")
@PropertySource("classpath:jdbcConfig.properties")
public class AnnotationConfig {
    @Value("${jdbc.driver}")
    private String driverClass;
    @Value("${jdbc.jdbcUrl}")
    private String jdbcUrl;
    @Value("${jdbc.user}")
    private String user;
    @Value("${jdbc.password}")
    private String password;
    @Bean
    public JdbcTemplate createJdbcTemplate(@Qualifier("dataSource") DataSource ds){
        System.out.println(ds);
        return new JdbcTemplate(ds);
    }
    @Bean("dataSource")
    public DataSource createDataSource() throws Exception {
        ComboPooledDataSource  dataSource=  new ComboPooledDataSource();
        dataSource.setDriverClass(driverClass);
        dataSource.setJdbcUrl(jdbcUrl);
        dataSource.setUser(user);
        dataSource.setPassword(password);
        return dataSource;
    }
}