[3]Spring以配置文件的方式进行属性注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_19560943/article/details/73603698

在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>

运行结果:

这里写图片描述

没有更多推荐了,返回首页