使用注解配置spring+junit 测试

使用注解配置spring

步骤:

1、导包:4+2+spring-aop

2、为主配置文件引入新的命名空间(约束)

3、开启使用注解代理配置文件

<!-- 指定扫描cn.itcast.bean报下的所有类中的注解.
	 注意:扫描包时.会扫描指定报下的所有子孙包
 -->
<context:component-scan base-package="cn.itcast.bean"></context:component-scan>

4、在类中使用注解完成配置

将对象注册到容器

@Component("user")
    @Service("user") // service层
    @Controller("user") // web层
    @Repository("user")// dao层

修改对象的作用范围

//指定对象的作用范围
@Scope(scopeName="singleton")

ps:测试一下不同的作用域singleton和prototype的区别

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("我是销毁方法!");
}

spring与junit整合测试

一、导包: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);
    }
}

上图:

猜你喜欢

转载自blog.csdn.net/zhouboke/article/details/82114050