在配置文件中指定扫描哪个包下的文件
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注解,在对象销毁前调用