在Java中进行属性注入的三种方式(也就是给属性赋值的几种方式)
1.使用set方法注入属性
public class User{
private String name;
public void setName(String name){
this.name = name;
}
}
User user = new User();
user.setName("wangke");
2.有参构造注入属性
public class User{
private String name;
public User(String name){
this.name = name;
}
}
User user = new User("wangke")
3.使用接口的方式进行属性的注入
public interface UserDao{
void setName(String name);
}
public class UserImpl UserDao implement UserDao{
private String name;
void setName(Strin name){
this.name = name;
}
}
UserImpl user = new UserImpl();
user.setName("wangke");
但是在spring框架中只支持前两种的属性注入的方式:
1. set方法注入(使用比较多)
2.带参的构造方法的注入
1. 使用有参数构造的注入:
User.java(需要进行装配的User类)
/**
* Created by wangke on 17-6-22.
*/
public class User {
private String userName;
private String age;
public User(String userName,int age) {
this.userName = userName;
this.age = age;
}
public void print(){
System.out.println("userName==>"+userName+"age==>"+age);
}
}
applicationContext.xml(spring配置文件)
<bean id="user" class="com.merpyzf.study01.User">
<constructor-arg name="userName" value="wangke"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
</bean>
当类的构造方法有多个参数时,我们可以通过在 constructor-arg 标签中指定要进行注入值的属性的 name 来确定 value 的对应关系。
也可以使用index属性来指定值所要注入的属性的位置,此时可以省略name属性
如下示例:
<constructor-arg value="wangke" index="0"></constructor-arg>
<constructor-arg value="20" index="1"></constructor-arg>
myTest.java(测试代码)
@Test
public void Test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
user.print();
}
运行效果:
2. 使用Set的方式进行属性的注入
User.java(需要进行属性注入的对象)
/**
* Created by wangke on 17-6-22.
*/
public class User {
private String userName;
private int age;
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(int age) {
this.age = age;
}
public void print(){
System.out.println("userName==>"+userName+"age==>"+age);
}
}
使用set方式进行对属性进行输入时,需要注入的属性必须要有setter方法
applicationContext.xml(spring配置文件)
<bean id="user" class="com.merpyzf.study01.User">
<!--name 属性值 : 对应类里面定义的属性名称 value : 需要给属性设置的值-->
<property name="age" value="20"></property>
<property name="userName" value="wangke"></property>
</bean>
当进行set方式进行属性注入的时候需要使用 property 属性来完成注入
myTest.java(测试代码)
@Test
public void Test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
user.print();
}
运行效果:
3. 注入复杂的数据类型(list、array、map)
这里注入复杂数据类型使用set的方式进行
User.java(需要进行属性注入的类)
public class User {
private String userName;
private List<String> books;
private String []girlFriends;
private Map<String,String> mMap;
public void setUserName(String userName) {
this.userName = userName;
}
public void setBooks(List<String> books) {
this.books = books;
}
public void setGirlFriends(String[] girlFriends) {
this.girlFriends = girlFriends;
}
public void setmMap(Map<String, String> mMap) {
this.mMap = mMap;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", books=" + books +
", girlFriends=" + Arrays.toString(girlFriends) +
", mMap=" + mMap +
'}';
}
}
applicationContext.xml(spring配置文件)
<bean id="user" class="com.merpyzf.study01.User">
<property name="userName" value="wangke"></property>
<property name="books" >
<!--配置list-->
<array>
<value type="java.lang.String"> 冰与火之歌 </value>
<value type="java.lang.String"> 活着 </value>
<value type="java.lang.String"> 一句顶一万句 </value>
</array>
</property>
<property name="girlFriends">
<!--配置数组-->
<array>
<value>小莉</value>
<value>凤姐</value>
</array>
</property>
<property name="mMap">
<!--配置map集合-->
<map>
<entry key="aa -key" value="bb -value"></entry>
<entry key="dd -key" value="ee - value"></entry>
</map>
</property>
</bean>
MyTest.java(测试代码)
@Test
public void Test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
运行效果:
4. 使用set方式给属性注入对象类型
在开发中我们经常会遇到在一个类中持有另外一个类的引用,下面来看一下如何让使用set的方法来给属性注入对象类型。
UserService.java(UserService类中持有UserDao对象)
/**
* Created by wangke on 17-6-22.
*/
public class UserService {
private UserDao mUserDao;
//在配置文件中通过set方式给mUserDao属性注入对象类型属性
public void setmUserDao(UserDao mUserDao) {
this.mUserDao = mUserDao;
}
public void print(){
//调用UserDao中的方法
mUserDao.printInfo();
}
}
UserDao.java
/**
* Created by wangke on 17-6-22.
*/
public class UserDao {
//只有一个方法用来测试对象创建是否成功
public void printInfo() {
System.out.println("UserDao ^-^");
}
}
applicationCOntext.xml(spring配置文件)
<!--首先创建UserDao对象-->
<bean id="userDao" class="com.merpyzf.study01.UserDao"></bean>
<bean id="userService" class="com.merpyzf.study01.UserService">
<!--通过ref属性注入对象类型 ref中的内容为对象的id值-->
<property name="mUserDao" ref="userDao"></property>
</bean>
运行结果: