Spring DI依赖注入的几种方式

构造注入

使用有参构造方式(三种)

都需要使用标签

第一种:使用下标(index)

​ index=“0” 就是有参构造方法里面的第一个参数,以此类推

<?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:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <!--使用有参构造第一种方式:使用下标-->    <bean id="user" class="com.jie.ioc01.User">        <constructor-arg index="0" value="李四"></constructor-arg>        <constructor-arg index="1" value="19"></constructor-arg>    </bean></beans>

测试,输出结果:

User{name='李四', age=19}

第二种:根据类型来创建(type)

​ 不推荐这种,要是构造方法中参数的类型都一样的话容易分不清楚

<?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:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <!--使用有参构造第二种方式——不推荐:根据类型来创建-->    <bean id="user" class="com.jie.ioc01.User">        <constructor-arg type="java.lang.String" value="王五"></constructor-arg>        <constructor-arg type="int" value="16"></constructor-arg>    </bean></beans>

测试,输出结果:

User{name='王五', age=16}

第三种:使用参数名(name)

​ 推荐这种方式的,简单明了,一一对应类中的属性

<?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:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">   <!--使用有参构造第三种方式——常用的:使用参数名来创建-->    <bean id="user" class="com.jie.ioc01.User">        <constructor-arg name="name" value="张三"></constructor-arg>        <constructor-arg name="age" value="22"></constructor-arg>    </bean></beans>

测试,输出结果:

User{name='张三', age=22}

Set注入

创建Address类

package com.jie.di;public class Address {    private String address;    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    @Override    public String toString() {        return "Address{"                  "address='"   address   '\''                  '}';    }}

创建Student类

package com.jie.di;import java.util.Arrays;import java.util.Map;import java.util.Properties;import java.util.Set;public class Student {    private String name;    private int age;    private Address address;    private String[] books;    private Map<String,String> card;    private Set<String> games;    private String wife;    private Properties info;        //省略get set方法        @Override    public String toString() {        return                "name='"   name   "\n"                  "age="   age  "\n"                  "address="   address  "\n"                  "books="   Arrays.toString(books)  "\n"                  "hobbys="   hobbys   "\n"                  "card="   card   "\n"                  "games="   games   "\n"                  "wife='"   wife   "\n"                  "info="   info;    }}

bean.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:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="address" class="com.jie.di.Address">        <property name="number" value="广东深圳"></property>    </bean>    <bean id="student" class="com.jie.di.Student">        <!--第一种注入:普通注入,value-->        <property name="name" value="张三" />        <property name="age" value="22" />        <!--第二种注入:Bean注入(引用数据类型),ref-->        <property name="address" ref="address" />        <!--第三种注入:数组-->        <property name="books">            <!--value-type就是数组的类型-->            <array value-type="java.lang.String" >                <value>java</value>                <value>js</value>                <value>mysql</value>            </array>        </property>        <!--第四种注入:List-->        <property name="hobbys">            <!--value-type list集合的类型-->            <list value-type="java.lang.String">                <value>跑步</value>                <value>听歌</value>                <value>打游戏</value>            </list>        </property>        <!--第五种注入:Map-->        <property name="card">            <!--                key-type:key的类型                value-type:value的类型            -->            <map key-type="java.lang.String" value-type="java.lang.String">                <entry key="QQ号" value="23169845484"></entry>                <entry key="微信号" value="1546752854"></entry>            </map>        </property>        <!--第六种注入:Set-->        <property name="games">            <set value-type="java.lang.String">                <value>守望先锋</value>                <value>CSGO</value>                <value>LOL</value>            </set>        </property>        <!--第七种注入:null-->        <property name="wife">            <null/>        </property>        <!--第八种注入:Properties-->        <property name="info">            <props>                <prop key="a">AAA</prop>                <prop key="b">BBB</prop>            </props>        </property>    </bean></beans>

测试注入:

package com.jie.di;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");        Student student = (Student) context.getBean("student");        //查看是否注入成功        System.out.println(student.toString());    }}

运行结果:

name='张三age=22address=Address{address='广东深圳'}books=[java, js, mysql]hobbys=[跑步, 听歌, 打游戏]card={QQ号=23169845484, 微信号=1546752854}games=[守望先锋, CSGO, LOL]wife='nullinfo={b=BBB, a=AAA}

很明显,我们全部注入成功了以上就是我们常见的几种注入方式了

其他方式注入

要想使用p命名空间和c命名空间的话必须在xml中的标签中加入:

xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"

p命名空间(相当于是标签的语法糖)接下来演示下:

<?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:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <--省略了<property>标签改为了p:address-->    <bean id="address" class="com.jie.di.Address" p:address="广东深圳"/><beans>    

测试运行:

package com.jie.di;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("bean02.xml");        //加入javabean对应的class类对象就不需要每次都强转了        Address address = context.getBean("address", Address.class);        //查看是否注入成功        System.out.println(address.toString());    }}

结果:

Address{address='广东深圳'}

c命名空间(就是构造注入标签的语法糖)

​ 注意一定要有 有参构造方法才能使用c命名空间

<?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:c="http://www.springframework.org/schema/c"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <--省略了<constructor-arg>标签改为了c:address-->    <bean id="address2" class="com.jie.di.Address" c:address="湖南长沙"/><beans> 

测试运行结果:

Address{address='湖南长沙'}

bean的作用域

单例模式(singleton):(spring默认机制)

​ 不管获取多少个对象,都是使用着同一个对象

<?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:c="http://www.springframework.org/schema/c"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <--scope属性可以更改bean的作用域-->    <bean id="address" class="com.jie.di.Address" scope="singleton"/><beans> 

测试:

package com.jie.di;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    public static void main(String[] args) {            ApplicationContext context = new ClassPathXmlApplicationContext("bean02.xml");        Address address = context.getBean("address", Address.class);        Address address2 = context.getBean("address", Address.class);        //比较两个对象是否是同一个对象        System.out.println(address == address2);  //输出结果是:true,证明使用着同一个对象            }}

原型模式(prototype)

​ 每次获取都创建了一个新的对象

<?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:c="http://www.springframework.org/schema/c"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <--scope属性可以更改bean的作用域-->    <bean id="address2" class="com.jie.di.Address" scope="prototype"/><beans> 

测试:

package com.jie.di;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    public static void main(String[] args) {            ApplicationContext context = new ClassPathXmlApplicationContext("bean02.xml");        Address address = context.getBean("address2", Address.class);        Address address2 = context.getBean("address2", Address.class);        //比较两个对象是否是同一个对象        System.out.println(address == address2);  //输出结果是:false,证明每次都是new了一个新对象            }}

来源:https://www.icode9.com/content-4-770701.html

(0)

相关推荐

  • Dubbo和Zookeeper

    一.软件架构演进 软件架构的发展经历了由单体架构.垂直架构.分布式架构到流动计算架构的演进过程. 1.单一架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于 ...

  • Spring学习02(DI依赖注入)

    5.依赖注入(Dependency Injection,DI) 5.1 概念 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 . 注入 : 指Bean对象所依赖的资源 , 由容器 ...

  • 通过Spring注解注册Bean的四种方式

    文章目录 包扫描+组件标注注解 @Bean注解 @Import注解 使用FactoryBean(工厂Bean) 给spring容器中注册bean有四种通过注解的方式: 包扫描+组件标注注解 @Bean ...

  • Spring注入Bean的七种方式

    通过注解注入Bean 背景 我们谈到Spring的时候一定会提到IOC容器.DI依赖注入,Spring通过将一个个类标注为Bean的方法注入到IOC容器中,达到了控制反转的效果.那么我们刚开始接触Be ...

  • 面试必问:Spring循环依赖的三种方式

    小A 你好面试官,非常高兴能参加今天的面试 面试官 没事,先做一个自我介绍吧 小A 我叫小A,工作三年了,做过...... 面试官 嗯,好的,看到你的项目这块,在公司主要用的就是spring全家桶相关 ...

  • spring依赖注入

    原文链接http://zhhll.icu/2021/01/03/%E6%A1%86%E6%9E%B6/spring/spring%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5 ...

  • Jenkins不同job之间依赖关系的两种配置方式

    项目之间总有依赖,比如A Job执行完执行B Job,如下图所示,如何建立依赖呢? 配置上游 我们通常喜欢配置上游依赖,在B中配置 配置如下信息.选择在其他项目构建完成后进行构建: Project t ...

  • Spring Boot 实现通用 Auth 认证的 4 种方式!

    来源:https://zhenbianshu.github.io/ 文章介绍了spring-boot中实现通用auth的四种方式,包括 传统AOP.拦截器.参数解析器和过滤器,并提供了对应的实例代码, ...

  • springboot应用获取spring上下文的4种方式

    实际开发中我们经常需要通过spring上下文获取一些配置信息,本文阐述springboot应用获取spring上下文的几种方式. 文章目录 方式一:实现ApplicationContextAware接 ...

  • 换一种方式理解叶芝诗歌,凝结一首诗依赖多少理性思考?| 此刻夜读

    文学报 · 此刻夜读 睡前夜读,一篇美文,带你进入阅读的记忆世界. william Butler Yeats 叶芝 诗歌常被认为是灵感的产物,而不是智慧的产物.海伦·文德勒被称为当代极为优秀.敏锐的诗 ...