@Autowired注解

@Autowired注解,默认情况下,如果因为找不到合适的bean将会导致autowiring抛出失败异常,
可以通过@Autowired(required=false)的方式避免.

@Autowired注解可以用于成员变量、set方法、构造器(一个类中只能有一个构造被注释成@Autowired(required=true))、list集合、map。

新建一个web项目,导入jar包,jar包如图:

一、@Autowired注解用于成员变量、set方法、构造器(一个类中只能有一个构造被注释成@Autowired(required=true))

1.新建一个service 接口和一个serviceImpl实现类

1)InjectionService接口

package com.moocer.injection.service;

public interface InjectionService {
    public void save(String arg);
}

2)新建InjectionServiceImpl实现类

package com.moocer.injection.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.moocer.injection.dao.InjectionDao;
import com.moocer.injection.service.InjectionService;
@Service
public class InjectionServiceImpl implements InjectionService{
    /**
     * @Autowired注解,默认情况下,如果因为找不到合适的bean将会导致autowiring抛出失败异常,
     * 可以通过@Autowired(required=false)的方式避免
     */
    //@Autowired//用于成员变量
    private InjectionDao injectionDao;

    //@Autowired//用于set方法
    public void setInjectionDao(InjectionDao injectionDao) {
        this.injectionDao = injectionDao;
    }
    @Autowired//用于注解构造器 ,一个类中只能有一个构造被注释成@Autowired(required=true)
    public InjectionServiceImpl(InjectionDao injectionDao){
        this.injectionDao = injectionDao;
    }
    @Override
    public void save(String arg) {
        System.out.println("InjectionServiceImpl service接受参数"+arg);
        arg = arg+":"+this.hashCode();
        injectionDao.save(arg);
    }

}

2.新建dao用于数据保存,这里只是模拟数据库保存操作,并不真正操作数据库

1)、新建InjectionDao接口

package com.moocer.injection.dao;

public interface InjectionDao {
    public void save(String args);
}

2)、新建InjectionDaoImpl实现类

package com.moocer.injection.dao.impl;

import org.springframework.stereotype.Repository;

import com.moocer.injection.dao.InjectionDao;
@Repository
public class InjectionDaoImpl implements InjectionDao{

    @Override
    public void save(String args) {
        //模拟保存数据
        System.out.println("InjectionDaoImpl 保存数据: "+args);
    }

}

3.新建一个测试类并继承测试类的工具类

1)、新建测试类工具类

package com.moocer.test;

import org.junit.After;
import org.junit.Before;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;

public class JUnitBaseUtil {
    private ClassPathXmlApplicationContext context;

    private String springXmlpath;

    public JUnitBaseUtil() {}

    public JUnitBaseUtil(String springXmlpath) {
        this.springXmlpath = springXmlpath;
    }

    @Before
    public void before() {
        if (StringUtils.isEmpty(springXmlpath)) {
            springXmlpath = "classpath*:spring-*.xml";
        }
        try {
            context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+"));
            context.start();
        } catch (BeansException e) {
            e.printStackTrace();
        }
    }

    @After
    public void after() {
        context.destroy();
    }

    @SuppressWarnings("unchecked")
    protected <T extends Object> T getBean(String beanId) {
        try {
            return (T)context.getBean(beanId);
        } catch (BeansException e) {
            e.printStackTrace();
            return null;
        }
    }

    protected <T extends Object> T getBean(Class<T> clazz) {
        try {
            return context.getBean(clazz);
        } catch (BeansException e) {
            e.printStackTrace();
            return null;
        }
    }
}

2)、新建测试类并继承工具类

package com.moocer.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

import com.moocer.injection.service.impl.InjectionServiceImpl;

@RunWith(BlockJUnit4ClassRunner.class)
public class InjectionTest extends JUnitBaseUtil{
    public InjectionTest(){
        super("classpath*:config/spring-injection.xml");
    }
    @Test
    public void testInjection(){
        InjectionServiceImpl injection = super.getBean("injectionServiceImpl");
        injection.save("this is autowired 注解");
    }
}

4.新建一个spring-injection.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" >

        <context:component-scan base-package="com.moocer.injection"></context:component-scan>
 </beans>

5.执行测试类得到结果

二、@Autowired注解用于list集合、map

1.新建一个XBeanInter的接口

package com.moocer.annotation.mulbean;

public interface XBeanInter {

}

2,新建两个实现类实现接口,不需要任何方法体,空着就行

1)、XBeanInterOne

package com.moocer.annotation.mulbean;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(value=2)//@Order(value=2)//这个注解是用来排序的,但是这个排序只针对list有效,针对map没效
@Component
public class XBeanInterOne implements XBeanInter {

}

2)、XBeanInterTwo

package com.moocer.annotation.mulbean;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(value=1)//@Order(value=1)
@Component
public class XBeanInterTwo implements XBeanInter {

}

3.新建一个CoInvoker类

package com.moocer.annotation.mulbean;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CoInvoker {
    @Autowired//用于list
    private List<XBeanInter> list;
    @Autowired//用于map
    private Map<String,XBeanInter> map;

    public void say(){
        if(null !=list && 0 != list.size()){
            //循环list,把list中每一个两个实现类XBeanInterOne XBeanInterTwo
            //全部通过@Autowired注解到list中去
            System.out.println("list");
            for(XBeanInter bean:list){
                System.out.println(bean.getClass().getName());
            }
        }else{
            System.out.println("List<XBeanInter> is null!!!");
        }

        if(map != null && 0 != map.size()){
            System.out.println("map");
            for(Map.Entry<String,XBeanInter> entry:map.entrySet()){
                System.out.println(entry.getKey()+":"+entry.getValue().getClass().getName());
            }
        }else{
            System.out.println("Map<String,XBeanInter> is null!!!!");
        }
    }
}

4、新建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" >
        <context:component-scan base-package="com.moocer.annotation"></context:component-scan>
 </beans>

5、新建测试类测试

package com.moocer.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

import com.moocer.annotation.BeanAnnotation;
import com.moocer.annotation.mulbean.CoInvoker;

@RunWith(BlockJUnit4ClassRunner.class)
public class AnnotationTest extends JUnitBaseUtil{
    public AnnotationTest(){
        super("classpath*:config/spring-beanannotation.xml");
    }

    @Test
    public void testMt(){
        CoInvoker co = super.getBean("coInvoker");
        co.say();
    }

}

6.执行测试类结果

时间: 2024-10-09 14:29:53

@Autowired注解的相关文章

Bean装配之@Autowired注解

@Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方式与set方式作用一样:第二种是在set方法上加注解:第三种是在构造器上加注解 测试代码如下: xml配置文件正常即可: 图解:可以在当前类中,声明ApplicationContext的引用,然后可以用@Autowired进行注解,这时候可以在当前类中得到这个容器,并且可以使用这个容器了 图解: 数

@Autowired注解(转)

5.6.4 @Autowired注解 自Spring诞生以来,的autowire和dependency-check属性便一直存在.当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required.同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下. Java代码 收藏代码 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.CONSTRUCTOR, Ele

Spring中@Autowired注解、@Resource注解的区别(转)

标签: Autowired Resource Spring(3)  Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Reso

Spring5:@Autowired注解、@Resource注解和@Service注解

什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低 2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率 为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java

Spring学习(9)--- @Autowired注解(二)

可以使用@Autowired注解那些众所周知的解析依赖性接口,比如:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher,MessageSource package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.conte

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析

Spring中@Autowired注解与自动装配

1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法.比如:Boss 拥有 Office 和 Car 类型的两个属性:public class Boss { private Car car; private Office office; // 省略 get/setter @Override public String toString() { retu

Spring @Autowired注解用在集合上面,可以保持接口的所有实现类

CourseService课程接口有2个子类,HistroyCourseServiceImpl和MathsCourseServiceImpl public interface CourseService { String getCourseName(); void attendCourse(); } package com.junge.spring.demo.service.course.impl; import com.junge.spring.demo.service.course.Cour

@Resource与@Autowired注解的区别

一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我:我研究一下. 在大学,学习J2EE实训时一直使用的是@Resource注解,后来我就养成习惯了.现在对这两个注解做一下解释: @Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配 @Resource(import javax.annotation.