类中属性注入的三种方式:

接口注入

public interface Injection{
    public void setName(String name);
}

public class User implements Injection{
    private String name;
    public void setName(String name){
        this.name = name;
    }
}

构造方法注入

public class User{
    private String name;
    public User(String name){
        this.name = name;
    }
}

setter注入

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

Spring中支持后两种。并且从spring2.5版本开始引入了名称空间p.可以使用名称空间p:注入属性。从Spring3.0开始可以使用SpEL(Spring Expression Language)注入属性,语法:#{表达式};

<property id="" value="#{表达式}"/>

一、基于XML配置

构造方法注入和setter注入

<!--1.使用带参构造方法注入属性值-->
    <bean id="customer" class="com.wl.spring.demo2.Customer">
        <constructor-arg value="苏福" name="name"/>
        <!--<constructor-arg index="0" value="苏福"/>-->
        <!--<constructor-arg index="1" value="20"/>-->
        <constructor-arg value="20" name="age"/>
    </bean>
    <!--2.通过setter方法注入属性值(一般使用这个)-->
    <bean id="customer2" class="com.wl.spring.demo2.Customer2">
        <property name="name" value="扶苏" />
        <property name="age" value="20"/>
    </bean>

名称空间p注入

加上下面这行即可使用名称空间p

xmlns:p="http://www.springframework.org/schema/p"
<!--使用名称空间p:注入属性-->
    <bean id="car" class="com.wl.spring.demo2.Car" p:carName="特斯拉" p:price="800000"/>
    <bean id="customer2" class="com.wl.spring.demo2.Customer2" p:age="20" p:name="扶苏" p:car-ref="car"/>

SpEL注入属性

<!--使用SpEL注入属性值-->
    <bean id="car" class="com.wl.spring.demo2.Car">
        <property name="carName" value="#{'劳斯莱斯'}"/>
        <property name="price" value="#{3000000}"/>
    </bean>
    <bean id="customer2" class="com.wl.spring.demo2.Customer2" >
        <property name="name" value="#{'扶苏'}"/>
        <property name="age" value="#{20}"/>
        <property name="car" value="#{car}"/>
    </bean>

对集合类型的属性注入方式


<!--对集合类型的属性注入-->
    <bean id="collectionBean" class="com.wl.spring.demo3.CollectionBean">
        <property name="list" >
            <list>
                <value>麦克雷</value>
                <value>汉尼拔</value>
                <value>巨石强森</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>盖伦</value>
                <value>盖伦</value>
                <value>亚索</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="1" value="提莫"/>
                <entry key="2" value="小炮"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">root</prop>
            </props>
        </property>
    </bean>

二、基于注解注入

使用注解方式注入需要先在配置文件中加上:

<context:component-scan base-package="com.wl.spring_annotation.demo1"/>

开启注解自动扫描。不需要配置bean。

@Controller("userController")
@Scope("singleton")
public class UserController {
//    @Autowired
//    @Qualifier("userService")//加上的话使用名称注入,不加的话使用类型注入
    @Resource(name = "userService")//等于上面两句
    private UserService userService;
    
    @Value(value ="UserControllerInfo")//普通属性注入
    private String info;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void addUser(){
        userService.addUser();
        System.out.println(this.info);
    }
    @PostConstruct
    public void setUp(){
        System.out.println("初始化...");
    }
    @PreDestroy
    public void tearDown(){
        System.out.println("销毁...");
    }
}

@Controller("userController")加在类前面,相当于bean配置中的id属性。

@Scope("singleton")相当于bean配置中的scope属性,默认为singleton。prototype为多例。

@Value(value ="UserControllerInfo"):配置于普通属性前,为其设置值

@Autowired @Qualifier("userService"):配置于引用属性前,开启该属性自动装配。相当于@Resource(name = "userService")。

@PostConstruct:配置于初始化方法前,指定该方法为初始化方法。

@PreDestroy:配置于销毁方法前,指定该方法为销毁方法。(销毁方法只对singleton有效)

三、实际开发过程中使用XML还是注解?

两种方式结合使用。使用XML注册Bean,使用注解进行属性的注入。

配置文件中:

<!--配置启用注解-->
    <context:annotation-config/>

    <bean id="userDao" class="com.wl.spring_annotation.demo2.UserDao"/>
    <bean id="userService" class="com.wl.spring_annotation.demo2.UserService"/>
    <bean id="userController" class="com.wl.spring_annotation.demo2.UserController"/>

配置文件中可以不用进行属性的注入,只是声明注册Bean即可.

具体类中:

@Controller
public class UserController {
    @Resource(name = "userService")
    private UserService service;

    public void addUser(){
        service.addUser();
    }
    @PostConstruct
    public void setUp(){
        System.out.println("初始化...");
    }
    @PreDestroy
    public void tearDown(){
        System.out.println("销毁...");
    }

//    public void setService(UserService service) {
//        this.service = service;
//    }
}

具体类中可以不用对属性提供setter方法,使用注解开启自动装配即可。