背景:
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
注解方式可以简化spring的IOC容器的配置
使用注解步骤:
1)先引入context名称空间
xmlns:context="http://www.springframework.org/schema/context"
2)开启注解扫描
<context:component-scan base-package="cn.itcast.e_anno2"></context:component-scan>
3)使用注解
通过注解的方式,把对象加入ioc容器。
创建对象以及处理对象依赖关系,相关的注解:
@Component 指定把一个对象加入IOC容器
@Repository 作用同@Component; 在持久层使用
@Service 作用同@Component; 在业务逻辑层使用
@Controller 作用同@Component; 在控制层使用
@Resource 属性注入
例子:
bean.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启注解扫描 --> <context:component-scan base-package="cn.itcast.e_anno2"></context:component-scan> </beans>
UserDao:
package cn.itcast.e_anno2; import org.springframework.stereotype.Repository; @Repository // 在持久层可以选择用这个注解 public class UserDao { public UserDao() { System.out.println("UserDao.UserDao()"); } public UserDao(int id) { System.out.println("UserDao.UserDao(int id)" + id); } public void save() { System.out.println("DB:保存用户!!!"); } }
UserService:
package cn.itcast.e_anno2; import javax.annotation.Resource; import org.springframework.stereotype.Service; @Service // 表示业务逻辑层的组件 public class UserService { // @Resource // 根据类型查找 【在容器中要确保该类型只有一个变量】 两种方式都可以 @Resource(name = "userDao") // 根据名称查找 private UserDao userDao; // 去容器中招UserDao类型的变量,找到后就赋值 public void save() { userDao.save(); } }
UserAction:
package cn.itcast.e_anno2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; //@Component("userAction") // 加入IOC容器 //@Component @Controller // 控制层的组件 public class UserAction { @Autowired private UserService userService; public String execute() { userService.save(); return null; } }
测试类:
package cn.itcast.e_anno2; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { // 创建容器对象 private ApplicationContext ac = new ClassPathXmlApplicationContext( "cn/itcast/e_anno2/bean.xml"); @Test public void testExecuteAction() { // 从容器中获取Action UserAction userAction = (UserAction) ac.getBean("userAction"); userAction.execute(); } }
总结:
1) 使用注解,可以简化配置,且可以把对象加入IOC容器,及处理依赖关系(DI)
2) 注解可以和XML配置一起使用。