zoukankan      html  css  js  c++  java
  • Spring学习(8)--- @Autowired注解(一)

    • 可以将@Autowired注解为“传统”的setter方法
    package com.mypackage;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class SimpleMovieLister {
    	private MovieFinder movieFinder;
    
    	@Autowired
    	public void setMovieFinder(MovieFinder movieFinder) {
    		this.movieFinder = movieFinder;
    	}
    	
    	//.....
    }
    
    •  可用于构造器或成员变量
    package com.mypackage;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class SimpleMovieLister {
    	
    	@Autowired
    	private BeanAnnotation beanAnnotation;
    	
    	private MovieFinder movieFinder;
    
    	@Autowired
    	public void setMovieFinder(MovieFinder movieFinder) {
    		this.movieFinder = movieFinder;
    	}
    	
    	//.....
    }
    
    •  默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免
    package com.mypackage;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class SimpleMovieLister {
    	private MovieFinder movieFinder;
    
    	@Autowired(required=false)
    	public void setMovieFinder(MovieFinder movieFinder) {
    		this.movieFinder = movieFinder;
    	}
    	
    	//.....
    }
    
    •  每个类只能有一个构造器被标记为required=true
    • @Autowired的必要属性,建议会用@Required注解

     例子:

    先新建两个接口(InjectionService、InjectionDAO),及实现类

    package com.mypackage;
    
    public interface InjectionDAO {
    	
    	public void save(String args);
    }
    
    package com.mypackage;
    
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class InjectionDAOImpl implements InjectionDAO {
    
    	public void save(String args) {
    		//模拟数据库操作
    		System.out.println("DAO保存数据:" + args);
    	}
    
    }
    
    package com.mypackage;
    
    public interface InjectionService {
    
    	public void save(String args);
    }
    
    package com.mypackage;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class InjectionServiceImpl implements InjectionService{
    
    	@Autowired
    	private InjectionDAO injectionDAO;
    
    	public void save(String s){
    		//模拟业务操作
    		System.out.println("Service接收参数:"+s);
    		s=s+":"+this.hashCode();
    		injectionDAO.save(s);
    	}
    }
    

    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-4.1.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-4.1.xsd">
            
            <context:component-scan base-package="com.mypackage">
            </context:component-scan>    
    </beans>
    

      单元测试:

    package com.mypackage;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    public class UnitTest {
    	
    	@Test
    	public void testAutoWired(){
    		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-beanannotation.xml");  
    		InjectionService service=(InjectionService)context.getBean("injectionServiceImpl");
    		service.save("this is autowired");;
    		
    	}
    }
    

     结果:

    2015-7-6 15:52:26 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1342a80d: startup date [Mon Jul 06 15:52:26 CST 2015]; root of context hierarchy
    2015-7-6 15:52:26 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [spring-beanannotation.xml]
    Service接收参数:this is autowired
    DAO保存数据:this is autowired:1811560891

    @Autowired也可应用于构造器

    修改InjectionServiceImpl实现类(添加setter)

    package com.mypackage;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class InjectionServiceImpl implements InjectionService{
    	
    	private InjectionDAO injectionDAO;
    	
    	@Autowired
    	public void setInjectionDAO(InjectionDAO injectionDAO) {
    		this.injectionDAO = injectionDAO;
    	}
    
    	public void save(String s){
    		//模拟业务操作
    		System.out.println("Service接收参数:"+s);
    		s=s+":"+this.hashCode();
    		injectionDAO.save(s);
    	}
    }
    

     测试结果:

    2015-7-6 15:55:23 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@939b78e: startup date [Mon Jul 06 15:55:23 CST 2015]; root of context hierarchy
    2015-7-6 15:55:23 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [spring-beanannotation.xml]
    Service接收参数:this is autowired
    DAO保存数据:this is autowired:1860295362
  • 相关阅读:
    iOS:真机调试
    iOS:MBProgressHUD的基本使用
    CocoaPods安装小步骤
    PictureBox 双缓冲防止闪屏
    两招小办法对付宝宝发烧、咳嗽。超级管用哈
    (转)经纬度坐标转换为屏幕坐标
    解决eclipse不识别Android手机的问题
    利用FFmpeg将RTSP转码成RTMP发布在RED5
    vlc做转发的命令
    字符编码
  • 原文地址:https://www.cnblogs.com/JsonShare/p/4624587.html
Copyright © 2011-2022 走看看