6.1、构造器注入
跳转到章节4
6.2、set方式注入【重点】
- 依赖注入:Set注入!
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
【环境搭建】
- 复杂类型 Address.java (pojo)
public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
- 真实测试对象 Student.java (pojo)
public class Student { private String name; private Address address; private String[] books; private List<String> hobbys; private Map<String,String> card; private Set<String> games; private String wife; private Properties info; //geter and seter and toString; }
- beans.xml
<bean id="address" class="com.yao.pojo.Address"> <property name="address" value="黑龙江"/> </bean> <bean id="student" class="com.yao.pojo.Student"> <!-- 第一种,普通值注入,value--> <property name="name" value="姚远"/> <!-- 第二种,bean引用注入,ref--> <property name="address" ref="address"/> <!-- 第三种,数组注入--> <property name="books"> <array> <value>红楼梦</value> <value>西游记</value> <value>水浒传</value> <value>三国演绎</value> </array> </property> <!-- List--> <property name="hobbys"> <list> <value>听歌</value> <value>敲代码</value> <value>看电影</value> </list> </property> <!-- Map--> <property name="card"> <map> <entry key="身份证" value="23**2"/> <entry key="银行卡" value="15142484"/> </map> </property> <!-- Set--> <property name="games"> <set> <value>LOL</value> <value>COC</value> <value>BOB</value> </set> </property> <!-- NULL--> <property name="wife"> <null/> </property> <!-- Properties--> <property name="info"> <props> <prop key="学号">11801******</prop> <prop key="性别">男</prop> <prop key="姓名">姚远</prop> <prop key="username">yaoyuan</prop> <prop key="password">yaoyuan</prop> </props> </property> </bean>
- 测试类
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Student student = (Student) context.getBean("student"); System.out.println(student.getName()); }
- 结果
6.3、扩展方式注入
p-namespace and c-namespace
<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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--p命名空间注入,可以直接注入属性的值:property -->
<bean id="user" class="com.yao.pojo.User" p:name="姚远" p:age="20"/>
<!--c命名空间注入,通过构造器注入:construct-args -->
<bean id="user" class="com.yao.pojo.User" c:name="姚远" c:age="20"/>
</beans>
测试类
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("userbeans_p.xml");
User user = context.getBean("user",User.class);
System.out.println(user.toString());
}
@Test
public void test3(){
ApplicationContext context = new ClassPathXmlApplicationContext("userbeans_c.xml");
User user = context.getBean("user",User.class);
System.out.println(user.toString());
}
注意点:
- p-namespace、c-namespace不能直接使用,需要导入xml约束!
-
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"
-
- 在使用c-namespace时候,切记要添加有参构造器,所谓的c-namespace就是构造器注入!
6.4、Bean Scopes
- 单例模式(Spring默认机制)
<bean id="user" class="com.yao.pojo.User" c:name="姚远" c:age="20" scope="singleton"/>
- 原型模式:每次从容器中get的时候,都会产生一个新对象!
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
- Request
当一个bean的作用域为Request,表实在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成,该作用域仅基于Web的SpringApplicationContext情形下有效。
举个🌰:
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,并且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将会被销毁。
-
Session
当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形有效。
举个🌰:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
针对某个HTTP Session,Spring容器会根据userPrefereces bean定义创建一个全新的userPrefereces bean实例,并且该userprefereces bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreference创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。