Ioc的另外一个名字叫依赖注入,讲的是同一个事情,只是站在不同的角度看待问题。
1.依赖注入 dependency injection
依赖:指bean对象的创建依赖于容器。bean对象的依赖资源。
注入:指bean对象依赖的资源由容器来设置和装配。
2.spring注入:构造器的注入·
3.spring注入:setter注入
要求被注入的属性必须有set方法,set方法的方法名由set+首字母大写。如果是boolean,没有get方法,是is.
a)常量注入:
package vo;
public class Student {
private String name;
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
<bean name="student" class="vo.Student">
<property name="name" value="张三丰" />
</bean>
b)对象注入(bean注入)
package vo;
public class Student {
private String name;
private Address addr;
public void setName(String name) {
this.name = name;
}
public void setAddr(Address addr) {
this.addr = addr;
}
public void show(){
System.out.println("name="+name);
System.out.println("name="+addr);
}
}
package vo; public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
<bean id="address" class="vo.Address"></bean>
<bean id="student"class="vo.Student">
<property name="name" value="zhangsanfeng"></property>
<property name="address" ref="address"></property>
</bean>
c)数组注入
package vo; public class Student { private String name; private Address addr; private String[] books; public void setName(String name) { this.name = name; } public void setAddr(Address addr) { this.addr = addr; } public void show(){ System.out.println("name="+name); System.out.println("name="+addr.getAddress()); System.out.println("books="+books[0]); } public void setBooks(String[] books) { this.books = books; } }
<property name="books">
<array>
<value>三毛</value>
<value>1毛</value>
</array>
</property>
</bean>d)List注入
Student.java
private List<String> hobbys;
public void setHobbys(List<String> hobbys) {
this.hobbys = hobbys;
}
beans.xml
<property name="hobbys">
<list>
<value>看书</value>
<value>写字</value>
</list>
</property>
e)map的注入:
<property name="cards">
<map>
<entry key="中国银行" ></entry>
<entry>
<key><value>工商银行</value></key>
<value>123424342323</value>
</entry>
<entry key="农业银行" value="123435345"></entry>
</map>
</property>
f)set 注入:
<property name="games">
<set>
<value>lol</value>
<value>saaed</value>
</set>
</property
g)Null注入:
<property name="wife"><null></null></property>
h)Properties注入:
<property name="info">
<props>
<prop key="学号">3020432</prop>
<prop key="sex">男</prop>
</props>
</property>
I)p-namespace p命名空间注入
需要在头文件中加入:xml
xmlns:p="http://www.springframework.org/schema/p"
<!-属性依然要设置set方法->
<bean id="user" class="vo.User" p:name ="namespace" p:age="23">
J) c注入
需要在头文件中加入:xml
xmlns:c="http://www.springframework.org/schema/c"
<bean id="u1" class="vo.User" c:name="noto" c:age="21" ></bean>
要求有对应参数的构造方法
package vo; public class User { private String name; private String age; public User() { } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }
bean的作用域:scope:singleton 单例(单例模式,整个容器中只有1个对象的实例)默认是单例的<bean id="u1" class="vo.User" scope="singleton"></bean>
prototype:原型每次获取bean的时候都产生1个新的对象
<bean id="u1" class="vo.User" scope="prototype"></bean>
request:每次请求时,创建一个新的对象
<bean id="u1" class="vo.User" scope="request"></bean>
session: 在会话的范围内是1个对象
<bean id="u1" class="vo.User" scope="session"></bean>
global session 只在portlet下应用 表示application
application 在一个应用范围中是1个对象(spring4中特有的)
注:在整合struts2和spring时 需要将action设置为scope=“prototype”