Spring笔记汇总
通过Spring工厂及配置文件为所创建对象的成员变量赋值
<bean id="person" name="p,p1" class="com.company.basic.Person">
<property name="id">
<value>100value>
property>
<property name="name">
<value>李四value>
property>
bean>
解耦合
Spring通过底层调用对象属性对应的set方法,完成成员变量的赋值,这种方式我们也称之为set注入
针对于不同类型的成员变量,在标签,需要嵌套其他标签
xxx
<property name="name">
<value>李四value>
property>
<property name="emails">
<list>
<value>48484@qq.comvalue>
<value>48484dad@qq.comvalue>
<value>48484dsa@qq.comvalue>
list>
property>
<property name="tels">
<set>
<value>31231341221value>
<value>56654454545value>
<value>56654454545value>
<value>56654454545value>
set>
property>
<property name="tels">
<set>
<value>31231341221value>
<ref bean=""/>
<set>set>
...
set>
property>
<property name="addresses">
<list>
<value>这里value>
<value>那里value>
<value>这里value>
list>
property>
<property name="addresses">
<list>
<value>这里value>
<ref bean=""/>
<set>set>
...
list>
property>
注意: map – entry
<property name="qqs">
<map>
<entry>
<key>
<value>我的qqvalue>
key>
<value>123456789value>
entry>
<entry>
<key>
<value>他的qqvalue>
key>
<value>12345678910value>
entry>
map>
property>
<map>
<entry>
<key>
<value>我的qqvalue>
key>
<ref bean=""/>
entry>
map>
Properties类型特殊的 Map key=String value=String
<property name="p">
<props>
<prop key="key1">value1prop>
<prop key="key2">value2prop>
props>
property>
需要程序员自定义类型转换器,处理。
/**
* 用于测试:测试JDK内置类型
*
*/
@Test
public void test7(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person person = (Person) ctx.getBean("person");
String[] emails = person.getEmails();
for (String email : emails) {
System.out.println("email = " + email);
}
System.out.println("------------------------------------------");
Set<String> tels = person.getTels();
for (String tel : tels) {
System.out.println("tel = " + tel);
}
System.out.println("------------------------------------------");
List<String> addresses = person.getAddresses();
for (String address : addresses) {
System.out.println("address = " + address);
}
System.out.println("------------------------------------------");
Map<String, String> qqs = person.getQqs();
for (Map.Entry<String, String> entry : qqs.entrySet()) {
System.out.println("key:" + entry.getKey() +" value:" +entry.getValue());
}
// 或者这样遍历
Set<String> keys = qqs.keySet();
for (String key : keys) {
System.out.println("key:" + key + " value:" + qqs.get(key));
}
System.out.println("------------------------------------------");
Properties properties = person.getP();
System.out.println("key is key1 value is " + properties.getProperty("key1"));
System.out.println("key is key2 value is " + properties.getProperty("key2"));
}
<bean id="userService" class="xxx.UserServiceImpl">
<property name="UserDao">
<bean class="xxx.UserDaoImpl"/>
property>
bean>
第一种赋值方式存在的问题
方法:
<bean id="userDao" class="xxx.UserDaoImpl"/>
<bean id="userService" class="xxx.UserSerivceImpl">
<property name="userDao">
<ref bean="userDao"/>
property>
bean>
#Spring4.x废除了 <ref local=""/> 基本等效 <ref bean=""/>
<bean id="person" class="xxx.Person">
<property name="name">
<value>小明value>
property>
bean>
JDK类型注入
<bean id="person" class="com.company.basic.Person">
<property name="name" value="小明"/>
<property name="id" value="123456"/>
bean>
<property name="userDao">
<ref bean="userDao"/>
property>
bean>
用户自定义类型注入
<bean id="userDao" class="com.company.basic.UserDaoImpl"/>
<bean id="userService" class="com.company.basic.UserServiceImpl">
<property name="userDao" ref="userDao"/>
bean>
注意: value属性只能简化8种基本类型+String注入标签
JDK类型注入
<bean id="person" class="com.company.basic.Person" p:name="小明" p:id="5"/>
用户自定义类型注入
<bean id="userDao" class="com.company.basic.UserDaoImpl"/>
<bean id="userService" class="com.company.basic.UserServiceImpl" p:userDao-ref="userDao"/>
@Test
public void test8(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.register(new User("第一个","1234"));
userService.login("第一个","4567");
}
@Test
public void test9(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person person = (Person) ctx.getBean("person");
System.out.println("person = " + person);
}
注入:通过Spring的配置文件,为成员变量赋值
Set注入:Spring调用Set方法通过配置文件为成员变量赋值
构造注入:Spring调用构造方法通过配置文件为成员变量赋值
package com.company.basic.customer;
import java.io.Serializable;
public class Customer implements Serializable {
private String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
}
<bean id="customer" class="com.company.basic.customer.Customer">
<constructor-arg>
<value>张三</value>
</constructor-arg>
<constructor-arg>
<value>123456</value>
</constructor-arg>
</bean>
通过控制<constructor-arg>标签的数量进行区分
通过在标签引入 type属性 进行类型的区分<constructor-arg type="">
未来的实战中, 应用set注入还是构造注入?
答案:set注入更多
控制:对于成员变量的控制权
反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中完成
注入:通过Spring的工厂及配置文件,为对象(bean, 组件)的成员变量赋值
依赖注入:当一个类需要另一个类时,就意味着依赖,一-旦出现依赖,就可以把另-个类作为本类的成员变量,最终通过Spring配置文件进行注入(赋值)。
Spring学习笔记:创建复杂对象、控制Spring工厂创建对象的次数