2b Spring注解.txt
UP 返回
12.注解注入
12.1
@Component 取代 <bean class="">
@Component("id") 取代 <bean id="" class="">
12.2 web开发 提供3个@Component 注解的衍生注解(功能一样)来取代<bean class="">
@Repository(“名称”):dao层
@Service(“名称”):service层
@Controller(“名称”):web层
之所以要使用不同的注解而不统一使用Component,是因为这几层存在层级关系,即其对象的创建存在顺序(毕竟controller要调用service),所以自然有的要先注入有的后注入,所以做了区分
@Autowired:自动根据类型注入 spring会自动根据类型为该属性注入值,不用写get set。如果对象是接口则从容器中找他的实现类,如果就是一个类则直接注入,
@Qualifier(“名称”):指定自动注入的id名称 上面是自动的,如果想要指定注入某个对象,就再加上这行,写上id(id要存在):@Autowired @Qualifier("userService")
@Resource(“名称”) 等同于上面两个功能,即@Resource(name="userService")等同于@Autowired @Qualifier("userService")
@ PostConstruct 自定义初始化方法
@ PreDestroy 自定义销毁方法
【首先需要修改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: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"> --对应修改(可以参照3.2中的配置)
<!--开启注解-->
<context:annotation-config/> --必须
<!--注解的位置-->
<context:component-scan base-package="com.cn"/> --必须,表示需要注解扫描的包。一般直接写最外面的包名即可全部扫描了
</beans>
【实际操作踩坑注意】:
spring使用3.2,jdk是1.8,报错org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file 原因是spring 3.2不支持1.8编译环境,要么将jdk降低,要么使用4.0以上spring
换为spring4.2后仍报错,org.springframework.beans.factory.BeanDefinitionStoreException,显示Caused by: java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource,此时就需要导入包spring-aop-4.2.0.RELEASE.jar,完美解决注解
【例1】
@Component
public class UserServiceImpl implements UserService {
String name;
}
public class LessonTest {
@Test
public void test() throws Exception{
ApplicationContext context =new ClassPathXmlApplicationContext("beans1.xml");
UserService service=context.getBean(UserServiceImpl.class); //通过类名来获取对象
//【如果仍然想通过id来获取,那么上面UserServiceImpl的注解可以改为@Component("userService"),相当于配了id,后面的写法就跟之前一样了】
System.out.println(service);
}
}
【例2】
//package com.cn.dao;
public interface UserDao {
public void add(User user);
}
@Repository
public class UserDaoImpl implements UserDao { //实现,Dao层使用Repository注解
@Override
public void add(User user) {
System.out.println("dao 添加用户");
}
}
//package com.cn.model;
public class User { //一个普通的类
private String name;
}
//package com.cn.service;
public interface UserService {
public void add(User user);
}
@Service
public class UserServiceImpl implements UserService { //service实现,使用Service注解
@Autowired
private UserDao dao; //Autowired使spring自动装配该成员对象
@Override
public void add(User user) {
System.out.println("service 创建对象"+user.toString());
//调用dao
dao.add(user);
}
}
//package com.cn.web.action;
@Controller
public class UserAction { //Controller注解表示web层
@Autowired
private UserService userService; //自动装配,同上
public void save(User user){
System.out.println("action save方法");
userService.add(user);
}
}
//测试
public class LessonTest {
@Test
public void test() throws Exception{
ApplicationContext context =new ClassPathXmlApplicationContext("beans1.xml");
UserAction action=context.getBean(UserAction.class);
User user=new User();
user.setName("wiw");
action.save(user);
}
}
【例3】
@Controller
@Scope("prototype") //通过注解配置多例(默认是单例,无需配置)
public class UserAction {
}
【例4】
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void add(User user) {
System.out.println("dao 添加用户");
}
@PostConstruct //自定义初始化
public void myInit(){
System.out.println("自定义初始化");
}
@PreDestroy //自定义销毁
public void myDestroy(){
System.out.println("自定义销毁");
}
}
public class LessonTest {
@Test
public void test() throws Exception{
ApplicationContext context =new ClassPathXmlApplicationContext("beans1.xml");
//关闭容器,这样才会执行到销毁方法
context.getClass().getMethod("close").invoke(context);
}
}
DOWN 返回