在配置文件中指定掃描哪個包下的文件
1 <?xml version= "1.0" encoding ="UTF-8" ?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 7 8 <!--指定掃描某個包下的所有類中的注解,如果這個包下還有子包,子包也會被掃描--> 9 <context:component-scan base-package="spr"></context:component-scan> 10 11 12 </beans>
1、Spring的@Component衍生出三個注解:
@Service-------Service層
@Controller-------------Web層
@Repository---------------dao層
通過再括號內指定字符串可指定創建對象的名稱
@Service("user")
2、修改對象的作用范圍:bean元素的scope屬性使用@Scope(scopeName="")來指定
1 package spr; 2 3 import org.springframework.context.annotation.Scope; 4 import org.springframework.stereotype.Component; 5 6 @Component("user") 7 @Scope(scopeName ="prototype") 8 public class User { 9 private String name; 10 private Integer age; 11 private Car car; 12 public Car getCar() { 13 return car; 14 } 15 public void setCar(Car car) { 16 this.car = car; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public Integer getAge() { 28 return age; 29 } 30 31 public void setAge(Integer age) { 32 this.age = age; 33 } 34 35 public void init(){ 36 System.out.println("初始化方法"); 37 } 38 public void destroy(){ 39 System.out.println("銷毀方法"); 40 } 41 42 @Override 43 public String toString() { 44 return "User{" + 45 "name='" + name + '\'' + 46 ", age=" + age + 47 ", car=" + car + 48 '}'; 49 } 50 }
測試類
1 package Test; 2 3 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 import spr.User; 7 8 public class DemoTest { 9 10 @org.junit.Test 11 public void fun1() throws Exception { 12 //1、創建容器對象,從類路徑下去加載xml的配置文件 13 ApplicationContext ac=new ClassPathXmlApplicationContext("\\applicationContext.xml"); 14 User u1=(User)ac.getBean("user"); 15 User u2=(User)ac.getBean("user"); 16 User u3=(User)ac.getBean("user"); 17 System.out.println(u1==u3); 18 } 19 }
因為scope設置為了多例模式prototype,所以每次從容器中取出Bean的時候都會創建一個新的對象,所以輸出為false
值類型注入
3、普通類型注入@Value
有兩種方法: 在對應的變量上添加;在對應變量的set方法上進行添加
在對應的變量上添加相當於通過反射在filed域上進行賦值,破壞了封裝性,所以不建議采用
如果注解中的屬性只有一個且是value的時候,value=可以省略直接寫@Value("18")
4、引用類型注入
1)自動裝配 @Autowired
2)自動裝配 @Autowired+強制使用名稱注入@Qualifer
如果匹配到多個類型一致的對象,將無法選擇具體注入哪個對象時,可以使用@Qualifer注入
3)手動注入@Resource,指定注入哪個名稱的對象,推薦使用此種方式
1 package spr; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.stereotype.Component; 5 6 @Component("car") 7 public class Car { 8 @Value("black") 9 private String color; 10 @Value("benchi") 11 private String name; 12 13 public String getColor() { 14 return color; 15 } 16 17 public void setColor(String color) { 18 this.color = color; 19 } 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 @Override 30 public String toString() { 31 return "Car{" + 32 "color='" + color + '\'' + 33 ", name='" + name + '\'' + 34 '}'; 35 } 36 }
1 <bean name="car2" class="spr.Car"> 2 <property name="name" value="mycar"></property> 3 <property name="color" value="red"></property> 4 </bean>
1 package spr; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.beans.factory.annotation.Qualifier; 5 import org.springframework.beans.factory.annotation.Value; 6 import org.springframework.context.annotation.Scope; 7 import org.springframework.stereotype.Component; 8 9 @Component("user") 10 @Scope(scopeName ="prototype") 11 public class User { 12 private String name; 13 14 @Value(value = "18") 15 private Integer age;
//使用自動注入的方式注入配置文件中name為car2的對象 16 @Autowired 17 @Qualifier("car2") 18 private Car car; 19 public Car getCar() { 20 return car; 21 } 22 public void setCar(Car car) { 23 this.car = car; 24 } 25 26 public String getName() { 27 return name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public Integer getAge() { 35 return age; 36 } 37 38 @Value(value = "18") 39 public void setAge(Integer age) { 40 this.age = age; 41 } 42 43 public void init(){ 44 System.out.println("初始化方法"); 45 } 46 public void destroy(){ 47 System.out.println("銷毀方法"); 48 } 49 50 @Override 51 public String toString() { 52 return "User{" + 53 "name='" + name + '\'' + 54 ", age=" + age + 55 ", car=" + car + 56 '}'; 57 } 58 }
因為有兩個car的注入方式,所以系統配置User對象的時候可以使用@Qualifer方式強制注入某個name的Car對象。
5、init-method destroy-method屬性對應的注解
@PostConstruct注解,在對象創建后調用
@PreDestroy注解,在對象銷毀前調用