对象依赖关系:DI 依赖注入
5. 注解方式(可以简化 Spring IOC容器的配置)
使用注解步骤:
- 先引入context名称空间(即 xml文件头添加内容)
- 开启注解扫描(xml 中)
- 使用注解( 注解方式可以与 xml配置方式结合使用)
@component(“userDao”) / @component:类上加此注解,把对象注入到IOC容器(在IOC容器加入的对象名称与类名相同,首字母小写)
@Resource(name=“userService”) / @Resource :类中的属性上加此注解,处理对象之间的依赖关系(将IOC中的对象注入类中的字段上,根据类型到IOC容器中查找对象,若找到注入到类中的字段上)
@Repository: 持久层的类上加此注解
@Service: 业务逻辑层上加此注解
@Controller: 控制层上加此注解
【类上:@component、@Repository、@Service、@Controller;
属性上:@Resource)】
( 注解方式可以与 xml配置方式结合使用:eg:若将 UserDao.java中类上 @Repository 注解注释掉,则不生成 userDao对象,在 xml文件中通过< bean>的方式生成对象(< bean id=“userDao” class=“com.asd.UserDao”>< /bean>生成 userDao对象;))
5.1 bean7.xml
(xml文件中文件头中要有 xmlns:context="http://www.springframework.org/schema/context"和 xmlns:context="http://www.springframework.org/schema/context/spring-context.xsd" 这句; 再开启注解扫描。)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- base-package扫描包即子包下的类 -->
<context:component-scan base-package="com.asd"></context:component-scan>
</beans>
5.2 UserDao.java
(UserDao类上添加 @component(value=“userDao”) 注解将对象添加到IOC容器,value是默认的可以省略,即在IOC容器加入的对象名称与类名相同,首字母小写;)
//@component("userDao")//将对象添加到IOC容器
//@component
@Repository //持久层
public class UserDao{
public void save(){
System.out.println("保存到数据库");
}
}
5.3 UserService.java
(UserService类上添加 @component(value=“userService”) 注解将对象添加到IOC容器,value是默认的可以省略;再在类中的 userDao属性上添加 @Resource(name=“userDao”) 注解将属性注入到类中的字段上即将IOC中的对象注入进来到字段上,直接使用此注解,而不需要set方法进行属性注入了;)
//@component("userService")//将对象添加到IOC容器
//@component
@Service
public class UserService{
//@Resource(name="userDao")//属性注入即将IOC中的对象注入进来到字段上,此时下面的set方法不再需要了
@Resource
private UserDao userDao;
/*public void setUserDao(UserDao userDao){
this.userDao=userDao;
}*/ //直接用注解进行属性注入,不需要set方法了
public void save(){
userDao.save();
}
}
5.4 UserAction.java
(UserAction类上添加 @component(value=“userService”) 注解将对象添加到IOC容器,value是默认的可以省略;再在类中的 userService属性上添加 @Resource(name=“userService”) 注解将属性注入到类中的字段上即将IOC中的对象注入进来到字段上,直接使用此注解,而不需要set方法进行属性注入了;)
//@Component("userAction")
//@Component
@Controller
public class UserAction{
//@Resource(name="userService")
@Resource
private UserSerice userService;
/*public void setUserService(UserService userService){
this.userService=userService;
}*/
public String addUser(){
userService.save();
return null;
}
}
2.5 Test.java
public class Test{
public static void main(String[] args) {
/*得到IOC容器*/
ApplicationContext ApplicationContext=new ClassPatnXmlApplicationContext();
/*从容器中获取对象*/
UserAction userAction=(UserAction)applicationContext.getBean("userAction");
userAction.addUser();
}
}
运行结果: