Spring容器创建Bean对象的3种方式
Spring容器创建Bean对象的3种方式
方式1:无参构造器 这是最常用的一种方式
方式2:静态工厂 对象由工厂来生产。
1)要有一个静态工厂类:里面的方法都是静态方法,如StaticFactory
2)要有生产对象的方法。如public static DataSource createDataSource(){}
方式3:动态工厂
思想同上。
以前创建一个对象,都是new出来的!
那Spring容器创建Bean对象,怎么创建?
即在Spring的xml配置文件配置标签,告诉Spring容器(又常被称为IoC容器)去创建Bean对象。
Spring核心配置文件,一般命名为applicationContext.xml,其初始内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
它的根标签就是。
方式1:无参构造
(1)定义一个类
自定义的类,如果是JDK自有或其他支持jar包中的java类,就不需要这一步了。
public class UserDaoImpl implements UserDao {
public void save(){
System.out.println("UserDaoImpl: save() running...");
}
}
(2)配置文件中声明Bean对象
<bean class="cn.yetis.dao.impl.UserDaoImpl" id="userDao"/>
Spring配置文件中声明Bean对象,就是告诉Spring框架,在Spring容器中去创建这个Bean对象。
(3)写测试代码
maven项目,测试包下,写个测试类
public class SpringTest {
/**
* Spring容器创建Bean对象:无参构造器方式
*/
@Test
public void test01() {
// 1. 创建Spring容器
String config = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
// 2. 从容器获取Bean对象
UserDaoImpl userDao = (UserDaoImpl) context.getBean("userDao");
// 3. 操作
userDao.save();//UserDaoImpl: save() running...
}
}
方式2:静态工厂
(1)写一个静态工厂类
类中有产生对象的方法
public class StaticFactory {
public static ComboPooledDataSource createDataSource(){
return new ComboPooledDataSource();
}
public static UserDao createUserDao(){
return new UserDaoImpl();
}
}
(2)xml配置
<!--context命名空间-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--==========静态工厂创建Bean对象===========-->
<!--非自定义类-->
<bean class="cn.yetis.factory.StaticFactory" factory-method="createDataSource" id="dataSource2">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--自定义类-->
<bean class="cn.yetis.factory.StaticFactory" factory-method="createUserDao" id="userDao2"/>
(3)写测试代码
/**
* Spring创建Bean对象:静态工厂方式
*/
@Test
public void test02() throws SQLException {
// 1. 创建Spring容器
String config = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
// 2. 获取Bean对象
UserDaoImpl userDao = (UserDaoImpl) context.getBean("userDao2");
DataSource dataSource2 = (DataSource) context.getBean("dataSource2");
// 3. 应用
userDao.save();//UserDaoImpl: save() running...
System.out.println(dataSource2.getConnection());
//com.mchange.v2.c3p0.impl.NewProxyConnection@5db45159
}
方式3:动态工厂
(1)写动态工厂类
public class DynamicFactory {
//Druid连接池,非定义类
public DruidDataSource createDruidDataSource(){
return new DruidDataSource();
}
//自定义类
public UserDaoImpl createUserDao(){
return new UserDaoImpl();
}
}
(2)xml配置
<!--context命名空间-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--动态工厂创建Bean对象-->
<!--非自定义类-->
<bean class="cn.yetis.factory.DynamicFactory" id="dynamicFactory"/>
<bean factory-bean="dynamicFactory" factory-method="createDruidDataSource" id="druidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--自定义类-->
<bean factory-bean="dynamicFactory" factory-method="createUserDao" id="userDao3"/>
(3)写测试代码
/**
* Spring创建Bean对象:动态工厂方式
*/
@Test
public void test03() throws SQLException {
// 1. 获取Spring容器
String config = "applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
// 2. 获取Bean对象
DataSource druidDataSource = (DataSource) context.getBean("druidDataSource");
UserDaoImpl userDao3 = (UserDaoImpl) context.getBean("userDao3");
// 3. 应用
userDao3.save();//UserDaoImpl: save() running...
System.out.println(druidDataSource.getConnection());
//com.mysql.jdbc.JDBC4Connection@4df50bcc
}