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 返回