1.Spring註解java
Spring除了默認的使用xml配置文件的方式實現配置以外,也支持使用註解的方式實現配置,這種方式效率更高,配置信息更清晰,修改更方便,推薦使用。web
所謂註解就是給程序看的提示信息,不少時候都是用來作爲輕量級配置的方式。spring
關於註解的知識點,能夠看我上篇隨筆內容。app
2.Spring引入context名稱空間dom
在MyEclipse中導入spring-context-3.2.xsd約束文件,要求Spring來管理。ide
在applicationContext.xml文件中,引入該schema文件:this
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-3.2.xsd 9 "> 10 </beans>
**能夠將以上頭信息加入MyEclipse模板中,方便後續自動生成使用。spa
3.Spring註解實現IOCprototype
(1)開啓包掃描code
在spring的配置文件中,開啓包掃描,指定spring自動掃描哪些個包下的類。只有在指定的掃描包下的類上的IOC註解纔會生效。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-3.2.xsd 9 "> 10 <!-- 開啓包掃描 --> 11 <context:component-scan base-package="cn.tedu.beans"></context:component-scan> 12 <!-- 13 <bean id="person" class="cn.tedu.beans.Person"></bean> 14 <bean id="cat" class="cn.tedu.beans.Cat"></bean> 15 <bean id="dog" class="cn.tedu.beans.Dog"></bean> 16 --> 17 </beans>
(2)使用註解註冊bean
在配置的包中的類上使用@Component註解,則這個類會自動被註冊成爲bean,使用當前類的class爲<bean>的class,一般狀況下使用類名首字母小寫爲<bean>id。
案例:
1 package cn.tedu.beans; 2 import org.springframework.stereotype.Component; 3 4 @Component 5 public class Person{ 6 }
(3)bean的id
一般狀況下註解註冊bean使用類名首字母小寫爲bean的id,可是若是類名第二個字母爲大寫則首字母保留原樣。
1 cn.tedu.beans.Person --> <bean id="person" class="cn.tedu.beans.Person"/> 2 cn.tedu.beans.PErson --> <bean id="PErson" class="cn.tedu.beans.Person"/> 3 cn.tedu.beans.NBA --> <bean id="NBA" class="cn.tedu.beans.NBA"/>
也能夠經過在@Component中配置value屬性,明確的指定bean的id
案例:
**可使bean實現BeanNameAware接口,並實現其中的setBeanName方法。
spring容器會在初始化bean時,調用此方法告知當前bean的id。經過這個方式能夠獲取bean的id信息。
1 package cn.tedu.beans; 2 import org.springframework.beans.factory.BeanNameAware; 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.beans.factory.annotation.Qualifier; 5 import org.springframework.stereotype.Component; 6 7 @Component("per") 8 public class Person implements BeanNameAware{ 9 @Override 10 public void setBeanName(String name) { 11 System.out.println("==="+this.getClass().getName()+"==="+name); 12 } 13 }
4.Spring註解方式實現DI
(1)在配置文件中開啓註解實現DI
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:util="http://www.springframework.org/schema/util" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-3.2.xsd 10 http://www.springframework.org/schema/util 11 http://www.springframework.org/schema/util/spring-util-3.2.xsd 12 "> 13 <!-- 開啓IOC包掃描 --> 14 <context:component-scan base-package="cn.tedu.domain"/> 15 <!-- 開啓註解配置DI --> 16 <context:annotation-config></context:annotation-config> 17 </beans>
(2)註解方式注入spring內置支持的類型數據 - 非集合類型
spring中能夠經過@Value來實現spring內置支持的類型的屬性的注入。
1 package cn.tedu.domain; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.stereotype.Component; 5 6 @Component 7 public class Student { 8 @Value("zs") 9 private String name; 10 11 @Value("19") 12 private int age; 13 14 @Override 15 public String toString() { 16 return "Student [name=" + name + ", age=" + age + "]"; 17 } 18 }
這種方式能夠實現spring內置支持類型的注入,可是這種方式將注入的值寫死在了代碼中,後續若是但願改變注入的值,必須來修改源代碼,此時能夠將這些值配置到一個properties配置文件中,再從spring中進行引入。
(3)註解方式注入spring內置支持的數據類型 - 集合類型
將spring-util-3.2xsd交給MyEclipse管理
在當前spring容器的配置文件中導入util名稱空間
在經過適當的util標籤註冊數據
案例:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:util="http://www.springframework.org/schema/util" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-3.2.xsd 10 http://www.springframework.org/schema/util 11 http://www.springframework.org/schema/util/spring-util-3.2.xsd 12 "> 13 <!-- 開啓IOC包掃描 --> 14 <context:component-scan base-package="cn.tedu.domain"/> 15 <!-- 開啓註解配置DI --> 16 <context:annotation-config></context:annotation-config> 17 <!-- 引入Properties文件 --> 18 <context:property-placeholder location="classpath:/stu.properties"/> 19 20 <!-- 配置集合數據 --> 21 <util:list id="l1"> 22 <value>aaa</value> 23 <value>bbb</value> 24 <value>ccc</value> 25 </util:list> 26 <util:set id="s1"> 27 <value>111</value> 28 <value>222</value> 29 <value>333</value> 30 </util:set> 31 <util:map id="m1"> 32 <entry key="k1" value="v1"></entry> 33 <entry key="k2" value="v2"></entry> 34 <entry key="k3" value="v3"></entry> 35 </util:map> 36 <util:properties id="p1"> 37 <prop key="p1">v1</prop> 38 <prop key="p2">v2</prop> 39 <prop key="p3">v3</prop> 40 </util:properties> 41 </beans>
再在類的屬性中經過@Value注入賦值
1 package cn.tedu.domain; 2 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Properties; 6 import java.util.Set; 7 8 import org.springframework.beans.factory.annotation.Value; 9 import org.springframework.stereotype.Component; 10 11 @Component 12 public class Student { 13 @Value("${name}") 14 private String name; 15 16 @Value("${age}") 17 private int age; 18 19 @Value("#{@l1}") 20 private List<String> list; 21 22 @Value("#{@s1}") 23 private Set<String> set; 24 25 @Value("#{@m1}") 26 private Map<String,String> map; 27 28 @Value("#{@p1}") 29 private Properties prop; 30 31 @Override 32 public String toString() { 33 return "Student [name=" + name + ", age=" + age + ", list=" + list 34 + ", set=" + set + ", map=" + map + ", prop=" + prop + "]"; 35 } 36 37 }
(4)使用註解注入自定義bean類型數據
在bean中的屬性上經過@Autowired實現自定義bean類型的屬性注入代碼:
1 package cn.tedu.domain; 2 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Properties; 6 import java.util.Set; 7 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Value; 10 import org.springframework.stereotype.Component; 11 12 @Component 13 public class Student { 14 @Autowired 15 private Dog dog; 16 17 @Autowired 18 private Cat cat; 19 20 @Override 21 public String toString() { 22 return "Student [dog="+ dog + ", cat=" + cat + "]"; 23 } 24 25 }
當spring容器解析到@Component註解時,會建立當前類的bean在spring容器中進行管理,在建立bean的過程當中發現了@Autowired註解,會根據當前bean屬性名稱,尋找在spring中是否存在id等於該名稱的bean,若是存在則自動注入,若是不存在,在檢查是否存在和當前bean屬性類型相同的bean,若是存在就注入,否在拋出異常。
也可使用@Qualifier(value="dog1")註解,明確的指定要注入哪一個id的bean
**也可使用@Resource(name="id")指定注入給定id的bean,可是這種方式不建議使用。
5.其餘註解
@Scope(value="prototype")
配置修飾的類的bean是單例或者多例,若是不配置默認爲單例
案例:
1 package cn.tedu.domain; 2 3 import org.springframework.context.annotation.Scope; 4 import org.springframework.stereotype.Component; 5 6 @Component 7 @Scope("prototype") 8 public class Teacher { 9 }
@Lazy
配置修飾的類的bean採用懶加載機制
案例:
1 package cn.tedu.domain; 2 3 import org.springframework.context.annotation.Lazy; 4 import org.springframework.stereotype.Component; 5 6 @Component 7 @Lazy 8 public class Teacher { 9 public Teacher() { 10 System.out.println("teacher construct.."); 11 }
@PostConstruct
在bean對應的類中,修飾某個方法,將該方法聲明爲初始化方法,對象建立以後當即執行。
@PreDestroy
在bean對應的類中,修飾某個方法,將該方法聲明爲銷燬的方法,對象銷燬以前調用的方法。
案例:
1 package cn.tedu.beans; 2 import javax.annotation.PostConstruct; 3 import javax.annotation.PreDestroy; 4 import org.springframework.stereotype.Component; 5 6 @Component 7 public class Dog { 8 public Dog() { 9 System.out.println("Dog...被建立出來了..."); 10 } 11 12 @PostConstruct 13 public void init(){ 14 System.out.println("Dog的初始化方法。。。"); 15 } 16 17 @PreDestroy 18 public void destory(){ 19 System.out.println("Dog的銷燬方法。。。"); 20 } 21 }
@Controller @Service @Repository @Component
這四個註解的功能是徹底同樣的,都是用來修飾類,將類聲明爲Spring管理的bean的。
其中@Component通常認爲是通用的註釋
而@Controller用在軟件分層的控制層,通常在web層
而@Service用在軟件分層中的訪問層,通常用在service層
而@Repository用在軟件分層的數據訪問層,通常在dao層