Spring4学习笔记:Spring框架中为一个bean配置依赖注入的方式

2023-11-18

Spring框架为一个bean配置依赖注入的四种方式:属性注入、构造方法注入、工厂注入、泛型依赖注入。

1、属性注入:属性方法注入利用setXxx() 方法注入 Bean 的属性值或者依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际项目中最常采用的注入方式 。首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性。

一个People的entity对象:

 1 package com.java1234.entity;
 2 
 3 public class People {
 4     
 5     private int id;
 6     private String name;
 7     private int age;
 8     
 9     public People(int id, String name, int age) {
10         super();
11         this.id = id;
12         this.name = name;
13         this.age = age;
14     }
15     
16     public People() {
17         super();
18         // TODO Auto-generated constructor stub
19     }
20     
21     public int getId() {
22         return id;
23     }
24     public void setId(int id) {
25         this.id = id;
26     }
27     public String getName() {
28         return name;
29     }
30     public void setName(String name) {
31         this.name = name;
32     }
33     public int getAge() {
34         return age;
35     }
36     public void setAge(int age) {
37         this.age = age;
38     }
39     
40     @Override
41     public String toString() {
42         return "People [id=" + id + ", name=" + name + ", age=" + age + "]";
43     }
44     
45     
46     
47 }

beans.xml配置文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6 
 7     <bean id="people" class="com.java1234.entity.People"></bean>
 8     <!-- 属性注入 :给一个bean对象的属性赋值-->
 9     <bean id="people2" class="com.java1234.entity.People">
10         <property name="id" value="123456"></property>
11         <property name="name" value="baozi"></property>
12         <property name="age" value="12"></property>
13     </bean>
14 </beans>

一个测试程序:

 

 1 package com.java1234.Test;
 2 
 3 import org.springframework.context.support.ClassPathXmlApplicationContext;
 4 
 5 import com.java1234.entity.People;
 6 
 7 
 8 public class Test {
 9     public static void main(String[] args) {
10         @SuppressWarnings("resource")
11         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
12         People people = (People)applicationContext.getBean("people");
13         System.out.println(people);
14         //属性注入:用于给bean对象的属性赋值
15         People people2 = (People)applicationContext.getBean("people2");
16         System.out.println(people2);
17         
18 }

 

2、构造方法注入:首先要保证被注入的bean要有包含全部属性的构造方法,然后再在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了<constructor-arg>节点,该节点有四个属性:

· index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;

 

· type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;

 

· ref 是指引用的依赖对象;

 

· value 当注入的不是依赖对象,而是基本数据类型时,就用value;

一个People的entity对象:同上

beans.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--只要是通过构造函数注入,在bean对象里边一定要有一个包含全部属性的构造方法 -->
    <!-- 1、构造方法注入(通过类型注入) -->
    <bean id="people3" class="com.java1234.entity.People">
        <constructor-arg type="int" value="654321"></constructor-arg>
        <constructor-arg type="String" value="lhy"></constructor-arg>
        <constructor-arg type="int" value="26"></constructor-arg>
    </bean>
    <!-- 2、构造方法注入(通过索引值注入) -->
    <bean id="people4" class="com.java1234.entity.People">
        <constructor-arg index="0" value="147"></constructor-arg>
        <constructor-arg index="1" value="yang"></constructor-arg>
        <constructor-arg index="2" value="1"></constructor-arg>
    </bean>
    <!-- 3、构造方法注入(联合使用类型和索引值注入) -->
    <bean id="people5" class="com.java1234.entity.People">
        <constructor-arg type="int" index="0" value="258"></constructor-arg>
        <constructor-arg type="String" index="1" value="Li"></constructor-arg>
        <constructor-arg type="int" index="2" value="2"></constructor-arg>
    </bean>
    
</beans>

 

一个测试程序:

 1 package com.java1234.Test;
 2 
 3 import org.springframework.context.support.ClassPathXmlApplicationContext;
 4 
 5 import com.java1234.entity.People;
 6 
 7 
 8 public class Test {
 9     public static void main(String[] args) {
10         @SuppressWarnings("resource")
11         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
12         //构造方法注入-->通过bean对象属性类型的方法给属性赋值
13         People people3 = (People)applicationContext.getBean("people3");
14         System.out.println(people3);
15         //构造方法注入-->通过bean对象属性索引值的方法给属性赋值
16         People people4 = (People)applicationContext.getBean("people4");
17         System.out.println(people4);
18         //构造方法注入-->联合使用两种方法给bean对象属性赋值
19         People people5 = (People)applicationContext.getBean("people5");
20         System.out.println(people5);
21         
22 }

在Spring中,注入依赖对象可以采用手工装配或自动装配,在实际应用开发中建议使用手工装配,因为自动装配会产生许多未知情况,开发人员无法预见最终的装配结果。手工装配依赖对象又分为两种方式:

  • 一种是在XML文件中,通过在bean节点下配置;如上面讲到的使用属性方法注入依赖对象和使用构造器方法注入依赖对象都是这种方式。

 

  • 另一种就是在java代码中使用注解的方式进行装配,在代码中加入@Resource或者@Autowired、
    • Autowired是自动注入,自动从spring的上下文找到合适的bean来注入
    • Resource用来指定名称注入
    • Qualifier和Autowired配合使用,指定bean的名称,如

 

1 @Autowired
2     @Qualifier("userDAO")
3     private UserDAO userDAO;
怎样使用注解的方式来为某个bean注入依赖对象呢?

第一、我们需要在Spring容器的配置文件beans.xml文件中配置以下信息,这些信息是一个Spring配置文件的模板:

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2  
 3 <beans
 4  
 5 xmlns="http://www.springframework.org/schema/beans"
 6  
 7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 8  
 9 xmlns:context="http://www.springframework.org/schema/context"
10  
11 xmlns:p="http://www.springframework.org/schema/p"
12  
13 xsi:schemaLocation="http://www.springframework.org/schema/beans 
14 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
15 http://www.springframework.org/schema/context
16 http://www.springframework.org/schema/context/spring-context-2.5.xsd
17 ">
18  
19 </beans>

 

注意:只有配置了<beans></beans>标签的代码才可以引入注解的命名空间,否则报错。

 

第二、在配置文件中打开<context:annotation-config>节点,告诉Spring容器可以用注解的方式注入依赖对象;其在配置文件中的代码如下:

1 <beans>
2  
3 ……
4  
5 <context:annotation-config></context:annotation-config>
6  
7 ……
8  
9 </beans>

 

第三,在配置文件中配置bean对象(这个就是对bean对象进行正常的装配);

第四,在需要依赖注入的UserBizImpl类中,声明一个依赖对象,不用生成该依赖对象的setter方法,并且为该对象添加注解:

 1 public class UserBizImpl implements UserBiz {
 2  
 3   @Resource(name="userDao")
 4  
 5   private UserDAO userDao = null;
 6  
 7     public void addUser() {
 8  
 9     this.userDao.addUser();
10  
11   }
12  
13 }

备注:使用注解的方式对依赖进行注入一般有两种写法:使用@Autowired或者@Resource。两者的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,但是当找不到与名称匹配的bean时,才会按类型装配。

 

比如:我们用@Autowired为上面的代码UserDAO接口的实例对象进行注解,它会到Spring容器中去寻找与UserDAO对象相匹配的类型,如果找到该类型则将该类型注入到userdao字段中;

 

如果用@Resource进行依赖注入,它先会根据指定的name属性去Spring容器中寻找与该名称匹配的类型,例如:@Resource(name="userDao"),如果没有找到该名称,则会按照类型去寻找,找到之后,会对字段userDao进行注入。

通常我们使用@Resource。

使用注解注入依赖对象不用再在代码中写依赖对象的setter方法或者该类的构造方法,并且不用再配置文件中配置大量的依赖对象,使代码更加简洁,清晰,易于维护。

在Spring IOC编程的实际开发中推荐使用注解的方式进行依赖注入。

 

 

 

3、工厂方法注入

  工厂方法注入又分为静态方法注入和非静态方法注入。这两者的区别主要是在装配bean对象的时候不一样,进而导致依赖注入的方法也不一样。

创建一个非静态工厂类:

 1 package com.java1234.factory;
 2 
 3 import com.java1234.entity.People;
 4 
 5 /**
 6  * 这是一个专门创建People对象的工厂,但是在这里为了简单起见,我们直接把创建的人的属性直接
 7  * 固定好了。
 8  * @author Baozi
 9  *
10  */
11 public class PeopleFactory {
12     public People creatPeople() {
13         People people = new People();
14         people.setId(1000);
15         people.setName("小七");
16         people.setAge(22);
17         return people;
18     }
19 }

 

创建一个静态工厂类:

 1 package com.java1234.factory;
 2 
 3 import com.java1234.entity.People;
 4 
 5 /**
 6  * 这是一个专门创建People对象的工厂,但是在这里为了简单起见,我们直接把创建的人的属性直接
 7  * 固定好了。
 8  * @author Baozi
 9  *
10  */
11 public class PeopleFactory_Static {
12     public static People creatPeople() {
13         People people = new People();
14         people.setId(1001);
15         people.setName("小狗");
16         people.setAge(29);
17         return people;
18     }
19 }

 

 

 

配置beans.xml文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6     
 7     <!-- 工厂方法注入:javaBean对象的创建是通过一个专门的工厂来完成的,包括两种:静态工厂
 8     和非静态工厂(静态在这里指的是创建javaBean的方法 是不是为静态的。)-->
 9     
10     <!-- 1、非静态的工厂方法注入:因为这个创建People的工厂是非静态的,所以我们还需要定义一
11     个Bean。这里大致的过程就相当于先创建一个工厂的Bean,为了让这个工厂创建一个people的
12     javaBean对象,我们需要待创建的JavaBean的id、由哪个工厂的哪个方法进行创建     -->
13     <bean id="peoplefactory" class="com.java1234.factory.PeopleFactory"></bean>
14     <bean id="people6" factory-bean="peoplefactory" factory-method="creatPeople"></bean>
15     
16     <!-- 2、静态的工厂方法注入:静态的工厂方法注入就是指创建JavaBean对象的方法是static属
17     性的方法:这个我们在bean.xml文件中使用的时候一定要注意:静态方法的调用可以通过
18     ——类名.方法名——的方式获得。 -->
19     <bean id="people9" class="com.java1234.factory.PeopleFactory_Static" factory-method=creatPeople></bean>
20 </beans>

 

测试程序:

 

 1 package com.java1234.Test;
 2 
 3 import org.springframework.context.support.ClassPathXmlApplicationContext;
 4 
 5 import com.java1234.entity.People;
 6 
 7 
 8 public class Test {
 9     public static void main(String[] args) {
10         @SuppressWarnings("resource")
11         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
12         //工厂方法的非静态方法创建JavaBean对象
13         People people6 = (People)applicationContext.getBean("people6");
14         System.out.println(people6);
15         //工厂方法的静态方法创建JavaBean对象
16         People people9 = (People)applicationContext.getBean("people9");
17         System.out.println(people9);
18     }
19 }

 

4、泛型依赖注入:这个设计的知识点比较多,等以后在总结。

 

 

 

转载于:https://www.cnblogs.com/BaoZiY/p/10200142.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring4学习笔记:Spring框架中为一个bean配置依赖注入的方式 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • “java.io.IOException:连接超时”和“SocketTimeoutException:读取超时”之间有什么区别

    如果我设置一个套接字 SoTimeout 并从中读取 当读取时间超过超时限制时 我会收到 SocketTimeoutException 读取超时 这是我的例子中的堆栈 java net SocketTimeoutException Read
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐

  • 腾讯云存储COS

    简介 对象存储 Cloud Object Storage COS 是由腾讯云推出的无目录层次结构 无数据格式限制 可容纳海量数据且支持 HTTP HTTPS 协议访问的分布式存储服务 腾讯云 COS 的存储桶空间无容量上限 无需分区管理 适
  • 低功耗蓝牙(BLE)你入门了吗

    前言 蓝牙低功耗 Bluetooth Low Energy 或称Bluetooth LE BLE 旧商标Bluetooth Smart 用于医疗保健 运动健身 安防 工业控制 家庭娱乐等领域 在如今的物联网时代下大放异彩 扮演者重要一环 是
  • Linux中断处理程序框架

    设备的中断会打断内核进程的正常调度和运行 系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍 但是 这个良好的愿望往往与现实不吻合 在多数真实的系统中 当中断到来时 要完成的工作往往并不是短小的 它可能要进行大量的耗时处理 为了在中断执
  • Bash中各种括号

    Bash中有各种括号 包括单小括号 双小括号 单中括号 双中括号 单大括号 而且它们之间很容易混淆 所以很有必要总结一下它们的用法 1 的用法 单个小括号用来创建一个子shell 例如 pwd home xfeng cd tmp pwd t
  • matlab智能算法之模拟退火算法

    智能算法之模拟退火算法 1 起源 2 物理退火流程 2 1 加温过程 2 2 等温过程 2 3 冷却过程 2 4 组合优化与物理退化 3 原理 3 1 算法核心迭代 3 2 具体流程 4 案例 4 1 求解n元函数的极小值 4 2 求解二元
  • Java 多线程编程

    Java给多线程编程提供了内置的支持 一个多线程程序包含两个或多个能并发运行的部分 程序的每一部分都称作一个线程 并且每个线程定义了一个独立的执行路径 多线程是多任务的一种特别的形式 但多线程使用了更小的资源开销 这里定义和线程相关的另一个
  • 代码整洁之道1-6章总结

    第一章 整洁代码 总的来说就是 整洁的代码有益于团队的测试开发 往大了说会影响公司的发展 作者列举了几个公司的反面教材 由于代码不够整洁 无法继续维护 导致公司倒闭的情况 迭代周期越来越长 所以说作为一个程序员 都有义务和责任去尽量写出简洁
  • 在服务中启动带有界面的程序

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 参考文章 http blog csdn net goingup article details 2932752 reply 在服务中启动带
  • android 中文权限解释

    PermissList Key android permission ACCESS CHECKIN PROPERTIES Title 访问检入属性 Memo 允许对检入服务上传的属性进行读 写访问 普通应用程序不能使用此权限 Level 0
  • linux脚本加载bashprofile,linux环境变量之profile .bash_profile .bash_login .profile .bashrc 加载详解...

    前言 这里讨论的shell都是bash shell 使用哪种shell形式可以通过修改 etc passwd 文件配置 bash sh csh 讨论的配置文件包括 etc profile etc bashrc bash login bash
  • 【Linux】Vmware虚拟机安装教程

    目录 一 下载Vmware和CentOS 二 使用Vmware创建虚拟机 1 创建虚拟机 2 稍后安装镜像 3 选择对应镜像版本 4 输入虚拟机名称和保存地址 5 指定虚拟机磁盘大小 6 完成 三 安装CentOS 1 查看cpu是否开启虚
  • 15.Linux多线程编程

    一 线程理论基础 1 定义 线程技术早在60年代就被提出 但真正应用多线程到操作系统中去 是在80年代中期 solaris是这方面的佼佼者 传统的Unix也支持线程的概念 但是在一个进程中只 允许有一个线程 这样多线程就意味着多进程 现在
  • Netty NIO 框架性能压测-短链接-对比Tomcat

    压测方案 准备多个文件大小分别为 1k 10k 100k 300k 使用ab分别按 50 2000 按50逐渐叠加 压测服务 每次请求10W次 硬件信息 CPU Intel R Xeon R CPU 1 86GHz 4 4G 统计脚本 gr
  • 嵌入式linux屏幕显示,嵌入式Linux下竖屏显示配置

    摘要 目前大多数设备的显示器是横屏 例如高清分辨率1920 1080 笔记本14寸显示器1366 768以及最近很热门的 4K 分辨率3840 2160 另外一种则是竖屏显示器 常见于娱乐 广告设备 手机最为常见的竖屏设备 以及户外的广告牌
  • git命令全家福

    1 切换分支 git checkout dev 2 拉取远程分支到本地 并切换到该分支 git pull git checkout b dev 本地分支名称 origin dev 远程分支名称 3 查看分支 git branch a
  • 2018年最常见的Python面试题&答案(上篇)

    Q 1 Python有哪些特点和优点 作为一门编程入门语言 Python主要有以下特点和优点 可解释 具有动态特性 面向对象 简明简单 开源 具有强大的社区支持 当然 实际上Python的优点远不止如此 可以阅读该文档 详细了解 https
  • ubuntu安装svn服务器

    安装命令 sudo apt getinstall subversion 创建项目目录 sudo mkdir home svn cd home svn project sudo chmod R777 project 创建svn仓库 sudo
  • rbac 另外一种逃逸

    Privilege Escalation from Node Proxy Rights in Kubernetes RBAC aquasec com
  • mysql时间相减-时间运算-转换毫秒值的问题

    mysql时间运算 一 时间相减发现与结果差距很大 二 原因 三 正确的运算 一 时间相减发现与结果差距很大 mysql gt select t1 t2 t2 t1 from mytest t1 t2 t2 t1 2013 04 21 16
  • Spring4学习笔记:Spring框架中为一个bean配置依赖注入的方式

    Spring框架为一个bean配置依赖注入的四种方式 属性注入 构造方法注入 工厂注入 泛型依赖注入 1 属性注入 属性方法注入利用setXxx 方法注入 Bean 的属性值或者依赖对象 由于属性注入方式具有可选择性和灵活性高的优点 因此属