ssm--spring2
阿新 • • 發佈:2018-12-09
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;
}
}