要获得Spring的一个Bean ,可以通过在配置文件里进行配置Bean,Spring 2.5 以后提出了注解的方式同样也可以配置Bean,在企业项目中,往往使用两者相结合的方式。
下面总结下我所遇到的注解及其用法,方便日后查阅。
一、什么是注解
简单的理解就是 简化 我们的工作
如前面获得一个类UserService的Bean ,我们得在配置文件中配:
使用注解只需要在类UserService的上一行写一句 @Service("userService") 即可
二、要做哪些准备才能使用注解
在 一、什么是注解 里,我们可以很轻松的在UserService的上一行写一句 @Service("userService") ,但是仅仅这样写是不起作用的。你得让spring容器知道去哪里找到这些注解,只有spring容器认识这些注解并知道它们有什么用,这时候就需要做一些准备工作了。在applicationContext.xml文件里进行。
1)引入约束
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
2)配置让spring容器去找到写了注解的包
1)@Component
这个注解是spring 2.5新特性里的对类注解的统称,也就是说所有的类都可以用这个注解进行配置Bean
2)@Controller 、@Service 、@Repository
这三个注解可以理解为作用和@Component相同,既然相同,为什么要引用呢?
在一个项目里,尤其是MVC的项目里,有表现层、业务层、数据连接层,如果每一层都有特定的类注解是不是会更新清晰呢。这三个Component的衍生注解就是这个作用
@Controller 表现层注解
@Service 业务层注解
@Repository 数据层注解
注:每个注解里可能有若干个value值,如Service注解里就有这个属性,完整的写应该是: @Service(value="userService"),但是我们约定俗称,这里的value值可以省略,直接写成@Service("userService")。这里的value值就相当于
2.对属性的注入
注:1.用注解的方式对属性的注入可以直接对属性写注解,也可以对属性对应的set方法写注解;
2.这里和配置文件对属性注入的区别是,直接对属性写注解时,可以不写它的set方法也能完成注入。
@Service("userService")
public class UserService {
@Value("张三")
private String name;
@Autowired
private UserDao userDao;
@Override
public String toString() {
return "UserService [name=" + name + ", userDao=" + userDao + "]";
}
}
1)对简单类型的注解
这里的简单类型包括八种基本类型和String等包装类型
使用@Value("值")的方式进行属性的注入
2)对复杂类型的注解 @Autowired
这里的复杂类型值在一个类里引入另一个类的对象作为属性,比如这里的
private UserDao userDao;
UserDao本身就是一个数据类型,这时候可以使用@Autowired进行注解,这里强调一下,@Autowired 是根据类型进行诸如的,所以后面不需要写value值,这里根据下方是UserDao 这个类型进行自动注解的。
3)@Qualifer("userDao")
@Qualifer("userDao") 这个注解和@Autowired 一样,区别是后者是依赖类型诸如,不用写value值,而前者是根据名称注入的,前者里的userDao是:
@Repository("userDao")
public class UserDao {
}
@Repository里的userDao
这个注解一般和@Autowired配合使用,如下:
@Autowired
@Qualifier("userDao")
private UserDao userDao;
4)Resource(name="userDao")
这个注解也是对复杂对象的使用,也是依赖名称注入属性的,简单的理解为Resource(name="userDao")和@Qualifer("userDao")是一样的。
在企业开发中,用到最多的应该是 2)的使用。3) 和4)需要认识,在见到的时候不至于懵逼即可。
3.注解初始化和销毁方法
前面说到,在Bean的生命周期里,有两个步骤,一个是在Bean被初始化的时候会执行的方法,另一个是Bean被销毁时执行的方法,当然销毁时需要关闭applicationContext对象。做到认识,会使用即可。
@PostConstruct
public void setup(){
//配置Bean初始化方法
}
@PreDestroy
public void destory(){
//配置Bean销毁时方法
}
4.Bean的作用范围
@Scope 注解是个类注解,直接对类进行注解,默认情况下,也就是没有写@Scope时是单例模式创建Bean,如果现在需要使用多例模式创建Bean,只需要在类的上一行添加注解: @Scope("prototype") 即可。
5.spring3.0 注解新特性
上面说到的四个注解都是spring 2.5的注解特性,spring 3.0 又引入了几个新注解,JavaConfig思想:使用一个java类来代替配置文件对Bean进行配置。
@Configuration
public class JavaConfig {
@Bean(name="userDao")
public UserDao getUserDao(){
return new UserDao();
}
@Bean(name="userService")
public UserService getUserService(){
return new UserService();
}
}
当然了,第一步还是需要在配置文件applicationContext.xml里引入约束和扫描包配置,参照 : 二、要做哪些准备才能使用注解
这里有两个注解 :
@Configuration 这是个类注解器,告诉Spring 被这个注解的类就是一个工厂,这里的类型JavaConfig可以随意取。
@Bean(name="userDao") 这是个方法注解,等同于
6.测试用注解
前面在进行测试Bean的时候都要通过下面这句代码来获得,很长很烦。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("userDao");
每次获得Bean都要写这两句就会造成大量重复代码,我们可以使用注解的方式来代替这句代码:
1)引包:
spring-test-3.2.0.RELEASE.jar spring的测试包,整合junit4包
junit4.jar 点击工程右键--> build path --> add libararys --> 选择junit --> 选择junit4 --> finished
2)注解写法如下
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //必写
@ContextConfiguration(locations="classpath:applicationContext.xml") //必写
public class TestJunit {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Test //必写
public void demo1(){
userDao.addUser();
}
}
其中有 三个注解是必须要写的。
第一个注解 @RunWith(SpringJUnit4ClassRunner.class) 是固定写法,整合junit4方便测试;
第二个注解 @ContextConfiguration(locations="classpath:applicationContext.xml") 加载配置文件,这里的classpath:表示src目录下,后面是我配置文件的名字;
第三个注解 @Test 是junit包单元测试必加的。
通过这种方式进行单元测试就会带来很多便利。