一、Bean的实例化方式
在XML方式下,Spring有三种途径来实例化Bean。
1.使用类的无参数构造函数来创建
这是最常见、最常用的实例化Bean的方式。假设现在有个类User
public class User {
publicc void add() {
System.out.println("add...");
}
}
XML配置文件如下
<bean id="user" class="cn.itcast.ioc.User"></bean>
代码中创建对象
public class Service{
public void testUser(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("user");
...
}
}
2.使用静态工厂创建
创建类后,需要再创建一个静态工厂
public class User {
publicc void add() {
System.out.println("add...");
}
}
//创建工厂类
public class userFactory {
//静态方法,返回User对象
public static User getUser(){
return new User();
}
}
配置文件
<bean id="user" class="cn.itcast.bean.BeanFactory" factory-method="getUser"></bean>
代码中创建对象
public class Service{
public void testUser(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("user");
...
}
}
3.使用实例工厂创建
创建类后,需要再创建一个普通工厂
public class User {
publicc void add() {
System.out.println("add...");
}
}
//创建工厂类
public class userFactory {
//静态方法,返回User对象
public User getUser(){
return new User();
}
}
配置文件如下
<bean id="userFactory" class="cm.itcast.bean.userFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="getUser"></bean>
代码中创建对象
public class Service{
public void testUser(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("user");
...
}
}
二、Bean标签常用属性
- id属性。标识,代码中可根据id值得到配置对象;不能包含特殊符号
- class属性。创建对象所在类的全路径
- name属性。功能和id属性相同,但它里面可以包含特殊符号。现在已不常用
- scope属性。Bean的作用范围:
- singleton。默认值,单例的
- prototype。多例的
三、属性注入
什么是属性注入? 创建对象时,对类里面属性设置值
对于普通的java类,有以下三种方式对类里面的属性设置值:
- 有参数构造函数
- set函数
- 接口注入,用的比较少
接口注入举例:
public interface Dao{
public void set(String name);
}
public class DaoImpl implements Dao{
private String name;
public void set(String name){
this.name=name;
}
}
在Spring框架里,只支持前面两种方式。下面分别对其进行说明
有参数构造函数
- 创建类
public class PropertyDemo1{
private String username;
public PropertyDemo1(Sting username){
this.name=name;
}
public void test1(){
System.out.println("demo1..." + username);
}
}
- 配置文件
<bean id="demo1" class="cn.itcast.property.PropertyDemo1">
<constructor-arg name="username" value="小王"></constructor-arg>
</bean>
- 代码中创建对象
public class Service{
public void testProperty(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("demo1");
...
}
}
Set方式
- 创建类
public class PropertyDemo2{
private String username;
public void setUsername(String name){
this.username=name;
}
public void test1(){
System.out.println("demo2..." + username);
}
}
- 配置文件
<bean id="demo2" class="ccn.itcast.property.PropertyDemo2">
<property name="username" value="小赵"></property>
</bean>
- 代码中创建对象
public class Service{
public void testProperty(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("demo2");
...
}
}
四、注入对象类型属性
- 创建对象
public class Dao{
public void add(){
System.out.println("add...");
}
}
public class UserService{
private Dao dao;
public void set(Dao dao){
this.dao=dao;
}
}
- 配置文件
<bean id="userDao" class="cn.itcast.ioc.Dao"></bean>
<bean id="userService" class="cn.itcacst.ioc.UserService">
<property name="dao" ref="userDao"></property>
</bean>
- 代码中创建对象
public class Service{
public void testDao(){
// 1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
// 2.得到配置创建的对象
User user = (User)context.getBean("userService");
...
}
五、P名称空间注入
这个方式在配置文件上有以下不同
xmlns:p = "http://www.springframework.org/schema/p"
<bean id="person" class="cn.itcast.property.Person" p:name="lucy"></bean>
六、注入复杂类型
这里说明三种类型注入的配置文件是如何配置的,分别是数组、list集合和map集合。类的创建和调用和上面的例子大致相同。
<bean id="person" class="cn.itcast.property.Person">
<!--数组-->
<property name="arrs">
<list>
<value>小王</value>
<value>小马</value>
<value>小赵</value>
</list>
</property>
<!--list-->
<property name="arrs">
<list>
<value>小奥</value>
<value>小金</value>
<value>小普</value>
</list>
</property>
<!--map-->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="mary"></entry>
<entry key="cc" value="tom"></entry>
</map>
</property>
</bean>