在Spring中,尽管使用配置文件可以实现Bean的装配工作,但如果应用中有很多的Bean时,会导致XML文件过于臃肿,给后续的维护和升级工作带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。
基于Annotation的装配
Spring中定义了一系列的注解,常用的注解如下所示。
- @Component:可以使用此注解描述Spring中的bean
- @Repository:用于数据访问层(DAO层)的类标识为Spring中的bena,但它是一个泛化的概念,仅仅表示一个组件(Bean)并可以作用在任何层次。使用时只需将相应注解标注在相应类上即可。
- @Service:通常作用字业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。
- @Controller:通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean器功能与 @Component相同。
@Autowired:对于bean的属性变量,属性的Setter方法及构造方法进行标注,配合对应的的注解完成bean的自动配置工作。默认按照Bean实例类型装配。
@Resource:其作用与Autowired一样,其区别在于@Autowired默认按照Bean类型装配,而@Resource默认按照Bean的实例名称进行装配。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean的实例名称,type属性解析为Bean实例类型。如果指定name属性,则按照实例名称进行装配;如果指定type属性,则按照Bean类型进行装配;如果都无法匹配,则抛出异常。
@Qalifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean实例名进行装配,Bean的实例名称由@Qualifier的注解参数指定。
上面几个注解中虽然@Repository、@Service与@Controller功能与@Component注解的功能相同,但是为了使标注类本身用途更加清晰,建议在实际开发中使用@Repository、@Service与@Component分别对类进行标注。
注解的使用
在com.shen.Dao包下创建IUser_uDao接口,定义一个 findUserById方法
public interface IUser_uDao {
public User_u findUserById(Integer id) ;
}
在该包下创建创建实现类UserDaoImpl
@Repository
public class UserDaoImpl implements IUser_uDao {
@Override
public User_u findUserById(Integer id) {
User_u user_u = new User_u();
user_u.setId(10);
user_u.setPassword("13124124123");
user_u.setUsername("张三");
return user_u;
}
}
在UserDaoImpl类上使用@Repository注解将UserDaoImpl类标识为Spring的bean,其写法相当于配置文件中
<bean name="userDaoImpl " class="com.shen.Dao.Impl.UserDaoImpl"/>
的编写
假设findUserById方法是从数据库查出数据,然后将其封装为User_u对象并返回。
在com.shen下创建了一个IUserService 接口
public interface IUserService {
public User_u findUserById(Integer id);
}
为IUserService 创建实现类
@Service
public class User_uService implements IUserService {
@Autowired
IUser_uDao userUDao;
@Override
public User_u findUserById(Integer id) {
return userUDao.findUserById(id);
}
}
首先使用@Service将User_uService 类标识为Spring中的bean,这相当于配置文件中
<bean name="user_uService" class="com.shen.service.impl.User_uService"/>
的编写。
然后使用@Autowired标注在userUDao属性上,这相当于
<property name="userUDao" ref "userDaoImpl "/>
的写法,可以理解为去容器中找到UserDao类型的bean,并注入给本类的userUDao属性。
在com.shen包下创建controller包并创建UserController类
@Controller
public class UserController {
@Autowired
User_uService user_uService;
public User_u showUser(){
return user_uService.findUserById(1);
}
}
在UserController 类中 使用@Controller将该类标记为Spring中的bean,这相当于
<bean name="userController " class="com.shen.controller.UserController"/>
的编写。 将@Autowired注解标记在user_uService属性上,spring就会将User_uService 类型的Bean自动注入到user_uService属性中。
创建application2.xml 文件 并增加 <context:component-scan base-package=“com.shen”/> (对包路径下的所有Bean文件进行扫描)
创建测试类:
public class Test {
@org.junit.Test
public void TestUser(){
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("application2.xml");
UserController bean = applicationContext.getBean(UserController.class);
System.out.println(bean.showUser());
}
}
运行结果如下: