SpringBean属性注入的两种方式

一、XML方式的属性注入

1、构造方法注入

通过构造方法注入bean的属性值或依赖的对象,保证bean实例在实例化后就可以使用。
构造器注入在元素里声明属性

bean

package com.zqh.service;

public class UserServiceImpl implements UserService {

    private String name;
	//构造方法
    public UserServiceImpl(String name) {
        this.name = name;
    }

    @Override
    public void save() {
        System.out.println("save"+name);
    }
}

xml配置

<bean id="userService" class="com.zqh.service.UserServiceImpl">
     <!--通过构造方法将属性注入bean-->
     <!--
		index:参数位置,第一个为0
		name:参数名称
		value:参数值
		type:参数类型
		ref:参数引用可以是另一个spring容器中的bean
	-->
     <constructor-arg name="name" value="张"></constructor-arg>
</bean>

2、SET方法注入

set方法注入设置注入的属性
set方法支持属性注入的类型
1、基本类型
2、pojo
3、集合类型
4、properties类型

bean

package com.zqh.service;

public class UserServiceImpl implements UserService {

    private String name;

    /*public UserServiceImpl(String name) {
        this.name = name;
    }*/

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void save() {
        System.out.println("save"+name);
    }
}

xml配置

    <bean id="userService" class="com.zqh.service.UserServiceImpl">
        <!--set方法的属性注入-->
         <!--
		name:参数名称
		value:参数值
		ref:参数引用可以是另一个spring容器中的bean
	-->
        <property name="name" value="张"></property>
    </bean>

3、P名称空间注入

p:<属性名>=“xxx” 引入常量值
p:<属性名>-ref=“xxx” 引用其他bean对象

bean

package com.zqh.service;

public class UserServiceImpl implements UserService {

    private String name;

    /*public UserServiceImpl(String name) {
        this.name = name;
    }*/

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void save() {
        System.out.println("save"+name);
    }
}

在xml约束中添加xmlns:p=“http://www.springframework.org/schema/p”

<bean id="userService" class="com.zqh.service.UserServiceImpl" p:name="张"/>

4、SpEL注入

SpEL:spring expression language,spring表达式语言,对依赖注入进行简化
语法:#{表达式}

#{‘hello’}:使用字符串常量
#{userBean}:使用另一个bean
#{userBean.name.toUpperCase}:使用指定属性,并使用方法
#{T(java.lang.Math).PI}:使用静态字段或方法

bean

package com.zqh.service;

public class UserServiceImpl implements UserService {

    private String name;

    /*public UserServiceImpl(String name) {
        this.name = name;
    }*/

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void save() {
        System.out.println("save"+name);
    }
}

xml

<!--<bean id="userService" class="com.zqh.service.UserServiceImpl" p:name="#{'张'}"/>-->
    <bean id="userService" class="com.zqh.service.UserServiceImpl" >
        <property name="name" value="#{'张'}"></property>
    </bean>

5、复杂属性注入

bean

public class CollectionBean {
    private String[] arrs; // 数组类型

    private List<String> list;// List集合类型

    private Set<String> set; // Set集合类型

    private Map<String,Integer> map;// Map集合类型

    private Properties properties; // 属性类型

    public String[] getArrs() {
        return arrs;
    }

    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Set<String> getSet() {
        return set;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public Map<String, Integer> getMap() {
        return map;
    }

    public void setMap(Map<String, Integer> map) {
        this.map = map;
    }

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "CollectionBean{" +
                "arrs=" + Arrays.toString(arrs) +
                ", list=" + list +
                ", set=" + set +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }
}

xml

<!--集合类型的属性注入=================================-->
    <bean id="collectionBean" class="com.bean.CollectionBean">
        <!--数组类型-->
        <property name="arrs">
            <list>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </list>
        </property>
        <!--List集合的属性注入-->
        <property name="list">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>
        <!--Set集合的属性注入-->
        <property name="set">
            <set>
                <value>ddd</value>
                <value>eee</value>
                <value>fff</value>
            </set>
        </property>
        <!--Map集合的属性注入-->
        <property name="map">
            <map>
                <entry key="aaa" value="111"/>
                <entry key="bbb" value="222"/>
                <entry key="ccc" value="333"/>
            </map>
        </property>
        <!--Properties的属性注入-->
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">1234</prop>
            </props>
        </property>
    </bean>

二、注解方式的属性注入

1、普通属性类型

bean属性注解配置

@Value("张")
private String name;

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"
       xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!--配置注解扫描-->
    <context:component-scan base-package="com.zqh"/>
    <bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>
    <bean id="userController" class="com.zqh.controller.UserController"></bean>
</beans>

2、其他类型

bean中注入另一个bean类型

1、@Autowired

默认按照属性类型进行注入,如果存在两个相同的bean类型属性,则需要按照bean的名称注入,使用@Qualifier和Autowired配置,Qualifier指定将哪个bean注入进来。

@Autowired
private UserDao userDao;

xml

<context:component-scan base-package="com.zqh"/>
<bean id="userDao" class="com.zqh.dao.UserDao"></bean>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>

2、@Autowired和@Qualifier

指定注入bean的名称
使用Qualifier指定bean名称后,注解或者xml配置的bean中必须指定相同的名称

@Autowired
@Qualifier(value = "userDao")
private UserDao userDao;

xml

<context:component-scan base-package="com.zqh"/>
<bean id="userDao" class="com.zqh.dao.UserDao"></bean>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>

3、@Resource

和@Autowired功能相似
@Resource是jdk的,@Autowired是spring提供的
需要指定bean的名称

 @Resource(name = "userDao")
 private UserDao userDao;

xml

<context:component-scan base-package="com.zqh"/>
<bean id="userDao" class="com.zqh.dao.UserDao"></bean>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值