Spring中属性注入的几种方式以及复杂属性的注入详解

时间:2022-01-26 23:28:39

在spring框架中,属性的注入我们有多种方式,我们可以通过set方法注入,可以通过构造方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象、数组、List、Map、Properties等,我们也都有相应的注入方式。
OK,接下来我们就来看看这么多不同的注入吧!

三种属性注入方式

1 set方法注入

set方法注入是我们开发中用的比较多的一种注入方式,举个:

假设我有一个User对象,想通过set方法注入,那么在User中我们首先要提供set方法

 1 public class User {
2
3 private String username;
4
5 public void setUsername(String username) {
6 this.username = username;
7 }
8
9 public void test() {
10 System.out.println(username);
11 }
12
13 }

然后在Spring配置文件中做如下配置:

<bean id="user" class="com.boss.domain.User">
<property name="username" value="张三" />
</bean>

测试代码:

1 @Test
2 public void test() {
3 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
4 User user = (User) context.getBean("user");
5 user.test();//张三
6 }

2 构造方法注入

假设我有一个User1,User1中有一个变量叫做username,我希望通过构造方法给它注入值,那么在User1中提供相应的构造方法即可

 1 public class User1 {
2
3 private String username;
4
5 //构造方法
6 public User1(String username) {
7 this.username = username;
8 }
9
10 public void test() {
11 System.out.println(username);
12 }
13
14 }

Spring配置:

<bean id="user1" class="com.boss.domain.User1">
<constructor-arg name="username" value="李四" />
</bean>

测试代码:

@Test
public void test1() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User1 user1 = (User1) context.getBean("user1");
user1.test();//李四
}

3 p名称空间注入

假设我有一个User2对象,User2中有一个username属性,我为该属性提供了set方法,我们来看看如何在配置文件中通过p名称空间进行注入

 1 public class User2 {
2
3 private String username;
4
5 public void setUsername(String username) {
6 this.username = username;
7 }
8
9 public void test() {
10 System.out.println(username);
11 }
12
13 }

p名称空间注入需要在配置文件中添加p名称空间约束:

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: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="user2" class="com.boss.domain.User2" p:username="王五" /> </beans>

测试代码:

1 @Test
2 public void test2() {
3 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
4 User2 user2 = (User2) context.getBean("user2");
5 user2.test();//王五
6 }

复杂属性的注入

上面这几个案例我们说的都是非常简单的属性,在实际开发中我们遇到的属性的样子可能多种多样,比如下面几种。

1 对象的注入

这算是开发中最最常用的注入了。举一个常见的使用场景,我们在Dao层进行数据库的操作,在Service层进行业务逻辑操作,那我在Service中需要有一个Dao实例,UserService 中提供set方法,通过set方法进行注入:

Dao层:

1 public interface UserDao {
2 public void getData();
3 }
1 public class UserDaoimpl implements UserDao {
2
3 @Override
4 public void getData() {
5 System.out.println("获取数据了");
6 }
7
8 }

Service层:

1 public interface UserService {
2 public void getData();
3 }
 1 public class UserServiceImpl implements UserService {
2
3 private UserDao userDaoImpl;
4
5 public void setUserDaoImpl(UserDao userDaoImpl) {
6 this.userDaoImpl = userDaoImpl;
7 }
8
9 @Override
10 public void getData() {
11 userDaoImpl.getData();
12 }
13
14 }

配置文件:

<bean id="userDao" class="com.boss.dao.imp.UserDaoimpl" />

<bean id="userService" class="com.boss.service.imp.UserServiceImpl">
<property name="userDaoImpl" ref="userDao" />
</bean>

测试代码:

@Test
public void test3() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
userService.getData();//获取数据了
}

当然我们也可以通过构造方法进行对象的注入,这里不再赘述。

2 数组注入&List集合注入&Map注入&Properties注入

这几个复杂属性的注入放到一起来说,假设我有一个User3对象,如下:

 1 public class User3 {
2 private String[] names;
3
4 private List<String> list;
5
6 private Map<String, String> map;
7
8 private Properties properties;
9
10 public void setNames(String[] names) {
11 this.names = names;
12 }
13
14 public void setList(List<String> list) {
15 this.list = list;
16 }
17
18 public void setMap(Map<String, String> map) {
19 this.map = map;
20 }
21
22 public void setProperties(Properties properties) {
23 this.properties = properties;
24 }
25
26 public void test() {
27 StringBuffer sb1 = new StringBuffer();
28 for (String name : names) {
29 sb1.append(name).append(",");
30 }
31
32 StringBuffer sb2 = new StringBuffer();
33 for (String s : list) {
34 sb2.append(s).append(",");
35 }
36
37 StringBuffer sb3 = new StringBuffer();
38 Set<String> keySet = map.keySet();
39 for (String s : keySet) {
40 sb3.append("key:" + s + ";value:" + map.get(s)).append(",");
41 }
42
43 System.out.println(sb1.toString());
44 System.out.println(sb2.toString());
45 System.out.println(sb3.toString());
46 System.out.println(properties.getProperty("username"));
47 }
48
49 }

配置文件:

<bean id="user3" class="com.boss.domain.User3">
<property name="names">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<property name="list">
<list>
<value>足球</value>
<value>篮球</value>
<value>乒乓球</value>
</list>
</property> <property name="map">
<map>
<entry key="username" value="张三" />
<entry key="password" value="123" />
</map>
</property>
<property name="properties">
<props>
<prop key="username">赵六</prop>
</props>
</property>
</bean>

测试代码:

@Test
public void test4() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User3 user3 = (User3) context.getBean("user3");
user3.test();
}

测试结果:

Spring中属性注入的几种方式以及复杂属性的注入详解

大家可以看到,数组和List集合的注入方式是一样的。Map由于是以键值对的形式存储的,所以注入稍微有一点区别。

Spring中属性注入的几种方式以及复杂属性的注入详解的更多相关文章

  1. Spring中属性注入的几种方式以及复杂属性的注入

    在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...

  2. Spring中bean实例化的三种方式

    之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例).那么今天我想来说说如何通过xml配 ...

  3. Spring中事务管理的两种方式

    spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...

  4. Spring中初始化bean和销毁bean的时候执行某个方法的详解

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct  和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...

  5. Spring中操作Hibernate的几种方式

    1.直接操作模版方式HQL: //通过spring的模版方式来操作Hibernate的HQL语句 return this.getHibernateTemplate().find("from ...

  6. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  7. Spring中配置数据源的四种方式

    1.spring自带的数据源 <bean id="dataSource" class="org.springframework.jdbc.datasource.Dr ...

  8. spring中的事务有两种方式

    1种是我们常用的声明式事务,如注解,或者配置文件配置的. 2种是编程式事务,如 TransactionTemplate 类的使用.

  9. Spring注入值得2种方式:属性注入和构造注入

    Spring是一个依赖注入(控制反转)的框架,那么依赖注入(标控制反转)表现在那些地方了? 即:一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的 ...

随机推荐

  1. ios动态创建类Class

    [Objective-C Runtime动态加载]---动态创建类Class 动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法 a.使用objc_al ...

  2. JMeter学习-037-JMeter调试工具之四-BeanShell&plus;jmeter&period;log

    前面三篇文章分别讲述了 HTTP Mirror Server . Debug PostProcessor 和 Debug Samper 的脚本调试实例.此文主要讲述第四种调试方法,通过 BeanShe ...

  3. iOS学习35数据处理之文件读写

    1. 沙盒机制 1> 沙盒概述 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹), 这个独立.封闭.安全的空间,叫做沙盒 注:① 每一个应用程序都会拥有一个应用程序沙盒 ② 应用程序 ...

  4. POJ1845 Sumdiv(求所有因数和&plus;矩阵快速幂)

    题目问$A^B$的所有因数和. 根据唯一分解定理将A进行因式分解可得:A = p1^a1 * p2^a2 * p3^a3 * pn^an.A^B=p1^(a1*B)*p2^(a2*B)*...*pn^ ...

  5. win8双屏敲代码

    23寸,AOC冠杰("AOC I2369V 23英寸LED背光超窄边框IPS广视角液晶显示器(银色)") 某东,920买入.

  6. hdu 2689

    hdu 2689 超级大水题....两种代码都过了,开始以为n^2会tle,后来竟然过了...汗 注意下cin写在while里面,就可以了 #include <iostream> usin ...

  7. lucene评分推导公式

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...

  8. Minimum Spanning Trees

    Kruskal’s algorithm always union the lightest link if two sets haven't been linked typedef struct { ...

  9. Spring Boot &plus; Mybatis &plus; Redis二级缓存开发指南

    Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...

  10. 《Linux内核》第七周 进程的切换和系统的一般执行过程 20135311傅冬菁

    进程的切换和系统的一般执行过程 一.内容总结与分析 进程调度与进程调度时机 进程调度需求的分类: 第一种分类方式: I/O -bound(频繁进行I/O,通常会花很多时间等待I/O操作) CPU-bo ...