1、导包:4+2+spring-aop
2、为主配置文件引入新的命名空间(约束)
3、开启使用注解代理配置文件
4、在类中使用注解完成配置
@Component("user")
@Service("user") // service层
@Controller("user") // web层
@Repository("user")// dao层
//指定对象的作用范围
@Scope(scopeName="singleton")
demo如下:
public class Demo {
@Test
public void fun1(){
//1 创建容器对象
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 向容器"要"user对象
User u1 = (User) ac.getBean("user");
User u2 = (User) ac.getBean("user");
System.out.println(u1==u2);
//3 打印user对象
System.out.println(u1);
ac.close();
}
}
测试结果:
这是初始化
true
User [name=tom, age=18, car=Car [name=附加迪威龙, color=绿色]]
这是销毁
修改范围:
//指定对象的作用范围
@Scope(scopeName="prototype")
测试结果:
这是初始化
这是初始化
false
User [name=tom, age=18, car=Car [name=附加迪威龙, color=绿色]]
这里稍微写一下两者区别:
这里的scope就是用来配置spring bean的作用域,它标识bean的作用域。
1、singleton 当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
2、prototype prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的操作。
简单的说:
singleton 只有一个实例,也即是单例模式。
prototype访问一次创建一个实例,相当于new。
一般情况下,有状态的bean需要使用prototype模式,而对于无状态的bean一般采用singleton模式(一般的dao都是无状态的)。
状态场景:
每次调用bean的方法,singleton多次调用bean实际上使用的是同一个singleton对象,而且保存了对象的状态信息。prototype都会提供一个新的对象(重新new),并不保存原有的实例。
-------------通过反射的Field赋值,破坏了封装性:
@Value("tom")
private String name;
-----------通过set方法赋值,推荐使用:
@Value("tom")
public void setName(String name) {
this.name = name;
}
//@Autowired //自动装配
//问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象.
//@Qualifier("car2")//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象
@Resource(name="car")//手动注入,指定注入哪个名称的对象(重点)
private Car car;
@PostConstruct //在对象被创建后调用.init-method
public void init(){
System.out.println("我是初始化方法!");
}
@PreDestroy //在销毁之前调用.destory-method
public void destory(){
System.out.println("我是销毁方法!");
}
一、导包:4+2+aop+test
二、配置注解和测试
//帮我们创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用哪个配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo {
//将名为user的对象注入到u变量中
@Resource(name="user")
private User u;
@Test
public void fun1(){
System.out.println(u);
}
}
上图: