Spring中属性注入的几种方式以及复杂属性的注入详解
在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名称空间约束:

配置文件:
<?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();
}
测试结果:

大家可以看到,数组和List集合的注入方式是一样的。Map由于是以键值对的形式存储的,所以注入稍微有一点区别。
Spring中属性注入的几种方式以及复杂属性的注入详解的更多相关文章
- Spring中属性注入的几种方式以及复杂属性的注入
		
在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...
 - Spring中bean实例化的三种方式
		
之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例).那么今天我想来说说如何通过xml配 ...
 - spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入
		
三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...
 - Spring中事务管理的两种方式
		
spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...
 - Spring中初始化bean和销毁bean的时候执行某个方法的详解
		
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...
 - Spring中操作Hibernate的几种方式
		
1.直接操作模版方式HQL: //通过spring的模版方式来操作Hibernate的HQL语句 return this.getHibernateTemplate().find("from ...
 - Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire
		
创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...
 - Spring中配置数据源的四种方式
		
1.spring自带的数据源 <bean id="dataSource" class="org.springframework.jdbc.datasource.Dr ...
 - spring中的事务有两种方式
		
1种是我们常用的声明式事务,如注解,或者配置文件配置的. 2种是编程式事务,如 TransactionTemplate 类的使用.
 
随机推荐
- RTSP H264/HEVC 流 Wasm 播放
			
本文将介绍 RTSP H264/HEVC 裸流如何于网页前端播放.涉及 WebSocket 代理发送流数据, Wasm 前端解码等. 代码: https://github.com/ikuokuo/rt ...
 - uboot常用命令及其使用
			
环境变量设置 setenv 设置一个环境变量 # 格式:setenv key vlaue setenv bootdelay 5 # 设置uboot启动延时5s 删除一个环境变量 uboot对于一个没有 ...
 - C#  ASP.NET RAZOR  链接SQLSERVER
			
@using System.Data.SqlClient; @using System.Data;//必须引用 <html> <body> <h1>Learn Sq ...
 - python打包发布自己的pip项目
			
原文链接:https://blog.csdn.net/Liangjun_Feng/article/details/80037315 一.注册pypi账号 网址:https://pypi.org/ 直接 ...
 - ABP 极简入门教程(三 权限)
			
此处演示为MVC项目,同样权限定义需要到Application中才能在获取API时进行权限验证 一.打开Sample.Core\Authorization\PermissionNames.cs增加授权 ...
 - CSS003. 盒子水平垂直居中简写属性(place-items)
			
place-items CSS 中的 place-items 是一个简写属性 ,它允许你在相关的布局(如 Grid 或 Flexbox)中可以同时沿着块级和内联方向对齐元素 (例如:align-it ...
 - table头部固定,内容滚动,类似新闻一下向上滚动
			
html: <div class="ul_box"> <table class="table1"> <thead> < ...
 - Spring基于XML方式加载Bean定义信息(又名:Spring IOC源码时序图)-图解
 - JEECG代码审计之文件上传
			
JEECG代码审计之文件上传 0x01 简述 JEECG(J2EE Code Generation)是一款基于代码生成器JEE的智能开发平台.引领新的开发模式(Online Coding->代码 ...
 - angularjs $http.get 和 $http.post 传递参数
			
$http.get请求数据的格式 $http.get(URL,{ params: { "id":id } }) .success(function(response, status ...