Spring第八章:Spring自动注入

一.自动注入

  1.在 Spring 配置文件中对象名和 ref=”id”id 名相同使用自动注入,可以不配置<property/>

  2.两种配置办法

    2.1 在<bean>中通过 autowire=”” 配置,只对这个<bean>生效

    2.2 在<beans>中通过 default-autowire=””配置,表当当前文件中所有<bean>都是全局配置内容

    2.3 自动注入代码

      2.3.1测试自动注入的实体类,老师和学生类

package com.suncl.model;

import org.springframework.beans.factory.annotation.Value;

/**
 * Created by SCL-PC on 2019/3/5.
 */

public class Teacher {
    private String name ="张三";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "name=‘" + name + ‘\‘‘ +
                ‘}‘;
    }
}

package com.suncl.model;

import org.springframework.beans.factory.annotation.Value;

import javax.annotation.Resource;

/** * Created by SCL-PC on 2019/3/5. */public class Student {    private String name = "李四";    private Teacher teacher22;

    public Student(Teacher teacher22){        this.teacher22 = teacher22;    }

    public Student() {    }

    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }

    public Teacher getTeacher22() {        return teacher22;    }

    public void setTeacher22(Teacher teacher22) {        this.teacher22 = teacher22;    }

    @Override    public String toString() {        return "Student{" +                "name=‘" + name + ‘\‘‘ +                ", teacher=" + teacher22 +                ‘}‘;    }}
 

      2.3.2配置文件

<?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" >

    <!--默认的注入方式 配置之后取beans的 default-autowire 如果默认的也没有配置就等同no-->    <bean id="student1" class="com.suncl.model.Student" autowire="default"></bean>

    <!--不自动注入-->    <bean id="student2" class="com.suncl.model.Student" autowire="no"></bean>

    <!--按照名称自动注入 也就是id-->    <bean id="student3" class="com.suncl.model.Student" autowire="byName"></bean>

    <!--按照类型自动注入 注意这里如果有两个相同的注入类型会报错-->    <bean id="student4" class="com.suncl.model.Student" autowire="byType"></bean>

    <!--按照构造器自动注入-->    <bean id="student5" class="com.suncl.model.Student" autowire="constructor"></bean>

    <bean id="teacher" class="com.suncl.model.Teacher"></bean>

    <!--写来测试按照类型注入的时候出错的场景-->    <!--<bean id="teacher2" class="com.suncl.model.Teacher"></bean>-->

</beans>

      2.3.3 测试类

package com.suncl.test;

import com.suncl.model.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by SCL-PC on 2019/2/28.
 */
public class Test {

    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student)ac.getBean("student3",Student.class);
        System.out.println(student.toString());

    }

}

    3.autowire=”” 可取值

      3.1 default: 默认值,根据全局 default-autowire=””值.默认全局和局部都没有配置情况下,相当于 no

  <!--默认的注入方式 配置之后取beans的 default-autowire 如果默认的也没有配置就等同no-->
<bean id="student1" class="com.suncl.model.Student" autowire="default"></bean>

Student student = (Student)ac.getBean("student1",Student.class);
Student{name=‘李四‘, teacher=null}

      运行结果可以看到 老师实体没有完成注入 但是我们如果配置了一个全局 default-autowire=””再看下结果

<?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" default-autowire="byName" >

    <!--默认的注入方式 配置之后取beans的 default-autowire 如果默认的也没有配置就等同no-->
    <bean id="student1" class="com.suncl.model.Student" autowire="default"></bean>
Student{name=‘李四‘, teacher=Teacher{name=‘张三‘}} 注入成功 

      3.2 no: 不自动注入

 <!--不自动注入-->
 <bean id="student2" class="com.suncl.model.Student" autowire="no"></bean>
Student student = (Student)ac.getBean("student2",Student.class);
Student{name=‘李四‘, teacher=null}

      不注入就只能是null了

      3.3 byName: 通过名称自动注入.在 Spring 容器中找类的 Id 

<bean id="student3" class="com.suncl.model.Student" autowire="byName"></bean>
Student student = (Student)ac.getBean("student3",Student.class);Student{name=‘李四‘, teacher=Teacher{name=‘张三‘}}

       可以看到按照名称注入了,怎么理解名称注入呢。假设我们现在修改下bean的id

<bean id="teacher22" class="com.suncl.model.Teacher"></bean>
 Student student = (Student)ac.getBean("student3",Student.class);
Student{name=‘李四‘, teacher=null}

      然后再执行测试类,发现无法注入成功。

      然后我们再去修改学生类的属性,修改teacher属性为teacher22完成注入

   private Teacher teacher22;
  public Teacher getTeacher22() {
        return teacher22;
    }

    public void setTeacher22(Teacher teacher22) {
        this.teacher22 = teacher22;
    }
Student student = (Student)ac.getBean("student3",Student.class);
Student{name=‘李四‘, teacher=Teacher{name=‘张三‘}}

      如下即可注入成功,所以byName的注入方式要求bean的id 和注入类的属性名称一致即可

      3.4 byType: 根据类型注入.

 <bean id="student4" class="com.suncl.model.Student" autowire="byType"></bean>
Student student = (Student)ac.getBean("student4",Student.class);
Student{name=‘李四‘, teacher=Teacher{name=‘张三‘}}

      特别注意容器里面不可以出现两个相同类型的bean

    <!--写来测试按照类型注入的时候出错的场景-->
    <bean id="teacher2" class="com.suncl.model.Teacher"></bean>

      例如我这边就定义了两个相同类型的Teacher实体。那么spring会出现错误

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.suncl.model.Teacher] is defined: expected single matching bean but found 2: teacher22,teacher2
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1288)
    ... 18 more
expected single matching bean but found 2: teacher22,teacher2。预期是一个满足的bean,但是找到了2个,立马就懵逼了。

      3.5 constructor: 根据构造方法注入.

        3.5.1 提供对应参数的构造方法(构造方法参数中包含注入对戏那个)

        3.5.2 底层使用 byName, 构造方法参数名和其他<bean>的 id

 public Student(Teacher teacher22){
        this.teacher22 = teacher22;
 }

        提供一个属性名称的构造器

  <!--按照构造器自动注入-->
<bean id="student5" class="com.suncl.model.Student" autowire="constructor"></bean>
Student student = (Student)ac.getBean("student5",Student.class);
Student{name=‘李四‘, teacher=Teacher{name=‘张三‘}}

        注意:这里定义了属性名称构造器之后,spring会提示有上面的byName和byType会出现错误,需要再手动添加一个无参构造器。java默认会为所有的类提供无参构造器,

        但是如果你自己写了任何有参数的构造器,那么默认的无参构造器就没有了。

原文地址:https://www.cnblogs.com/reload-sun/p/10480602.html

时间: 2024-08-28 13:07:47

Spring第八章:Spring自动注入的相关文章

Quartz与Spring集成 Job如何自动注入Spring容器托管的对象

在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类.很显然,第二种方式远比第一种方式来的灵活. 测试环境 Spring3 M2 quartz-2.1.7 我们要达到这样的效果 public class CancelUnpaidOrderTask implements Job { @Autowired private AppOrderService orderService; @Over

web 工程中利用Spring的 ApplicationContextAware接口自动注入bean

最常用的办法就是用 ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 等对象去加载Spring配置文件,这样做也是可以, 但是在加载Spring配置文件的时候,就会生成一个新的ApplicaitonContext对象而不是Spring容器帮我们生成的哪一个, 这样就产生了冗余, 所以不采用应用程序手动加载文件的方式,而是使用Applic

Spring框架使用ByName自动注入同名问题剖析

问题描述 ??我们在使用spring框架进行项目开发的时候,为了配置Bean的方便经常会使用到Spring当中的Autosire机制,Autowire根据注入规则的不同又可以分为==ByName==和==ByType==这两种机制(两者的用法和区别可以参考[email protected]官方文档).但大家在使用Autowire当中==ByName==机制的时候有没有思考过这样一个问题,当我们配置了两个name属性相同的Bean,Spring在自动注入的时候会采取怎样处理方式?会覆盖?还是抛出异

spring mvc:属性无法自动注入

在使用spring mvc 3开发一个项目模块时,遇到这样一个奇怪的问题: 前端页面发送的请求中,所有参数都无法自动注入到指定的@ModelAttribute对象中,经过检查,参数名称与接受对象的属性名称保持一致. 测试其它类似的模块时发现并未出现同样的情况,说明后端应该是正常的,问题出现在前端. 经检查,该模块前端使用异步(ajax)的方式传递参数,设置了request的content-type为application/json,去除这个设置后正常.

java的反射原理与Spring的自动注入(转载)

Java反射原理与Spring的自动注入 反射的定义 java的反射机制就是在运行状态中, 对于任意一个类都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性. 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Sping的自动注入原理 一个Bean的类: public class User{ private String username; private String mobile; public String getUsernam

Spring自动注入有关的注解

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

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

Spring IOC注入(三)自动注入

前俩篇讲了一下IOC注入的set方式注入和基于构造器的注入,现在就来讲讲自动注入~ 自动注入:容器依照一些规则去装配bean中的一个属性 注意:自动装配只对[对象类型]起作用,对基本类型不起作用. 自动注入有俩种方式: 第一种: 在beans标签中配置装载方式:defadefault-autowire="byType"或defult-autowire="byName" default-autowire="byType"或default-autow

spring自动注入是单例还是多例?单例如何注入多例?

单例多例需要搞明白这些问题:      1. 什么是单例多例:      2. 如何产生单例多例:      3. 为什么要用单例多例      4. 什么时候用单例,什么时候用多例:   1. 什么是单例.多例: 所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 单例模式和多例模式说明: 1. 单例模式和多例模式属于对象模式. 2. 单例模式的对象在整个系统中只有一份,多例模式可以有