今天刚学到bean的构造方法,就把自己的笔记分享到CSDN
方法一:构造方法
先给出代码:
public class UserDaoImpl implements UserDao {
//可省略
public UserDaoImpl(){
System.out.println("bean实例化之构造方法");
}
@Override
public void save() {
System.out.println("bean成功实例化");
}
}
不使用spring创建对象:
public class APP2 {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
userDao.save();
}
}
使用spring创建对象:
xml配置文件:
<!-- 实例化bean之构造方法-->
<bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>
使用spring创建对象:
public class APP2 {
public static void main(String[] args) {
// UserDao userDao = new UserDaoImpl();
// userDao.save();
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
}
}
运行结果:
方法二:静态工厂
先创建工厂类
public class UserDaoFactoryStatic {
public static UserDao getUserDao(){
return new UserDaoImpl();
}
}
不使用spring创建对象:
public class APP2 {
public static void main(String[] args) {
// 静态工厂
UserDao userDao = UserDaoFactoryStatic.getUserDao();
userDao.save();
}
}
使用spring创建对象
配置xml文件:
注意这里class创建的是UserDaoFactoryStatic的bean对象,所以我们需要factory-method来调用方法创建userDaoImpl的bean对象
<!-- 实例化bean之静态工厂-->
<bean id="userDao" class="org.example.factory.UserDaoFactoryStatic" factory-method="getUserDao"></bean>
方法三:实例工厂
复杂版:
先创建实例工厂
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
不使用spring创建对象:
由于UserDaoFactory不是静态,所以要想调用getUserDao方法得先创造UserDaoFactory对象
public class APP2 {
public static void main(String[] args) {
// 实例工厂
UserDaoFactory userDaoFactory = new UserDaoFactory();
UserDao userDao = userDaoFactory.getUserDao();
userDao.save();
}
}
使用spring创建对象:
xml文件配置
<!-- 实例化bean之实例工厂复杂版-->
<!-- 先创建userDaoFactory的bean对象-->
<bean id="userDaoFactory" class="org.example.factory.UserDaoFactory"></bean>
<!-- 再创建userDao的bean对象-->
<bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"></bean>
咋一看感觉使用spring更加麻烦了,而且每次都要先创建工厂的bean,于是spring出于人性化就给了FactoryBean接口让我们更简易的操作
简易版
重新创建实例工厂,实现FactoryBean接口
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
System.out.println(this);
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
System.out.println(UserDao.class);
return UserDao.class;
}
}
xml配置文件:
<!-- 实例化bean之实例工厂简易版-->
<bean id="userDao" class="org.example.factory.UserDaoFactoryBean"></bean>
如何理解FactoryBean的两个方法呢?
可以看到xml配置里创建的是UserDaoFactoryBean的对象
我的理解是配置里创建了UserDaoFactoryBean的bean对象,然后配置自动扫描UserDaoFactoryBean类,第一个方法返回的是工厂创建bean的对象方法;
第二个方法是返回字节码文件,返回给xml配置文件我们要实例化bean的地址信息。
最后
三种方法的测试对比。
public class APP2 {
public static void main(String[] args) {
// 普通方法实现
// 实例工厂
// UserDaoFactory userDaoFactory = new UserDaoFactory();
// UserDao userDao = userDaoFactory.getUserDao();
// userDao.save();
// 静态工厂
// UserDao userDao = UserDaoFactoryStatic.getUserDao();
// userDao.save();
// 构造方法
// UserDao userDao = new UserDaoImpl();
// userDao.save();
//Spring方法实现
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
}
}
可以看到spring方法简化了我们测试代码,三种方法都是一样的代码,但需要我们在xml文件里配置bean
ClassPathXmlApplicationContext获取我们xml文件
getBean()是入口,指向的是bean标签的id,找到了id就可以找到对应的类进行对象的创建。
xml配置文件:
id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
class:bean的类型,即配置的bean的全路径类名
<?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">
<!-- 实例化bean之构造方法-->
<!-- <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>-->
<!-- 实例化bean之静态工厂-->
<!-- <bean id="userDao" class="org.example.factory.UserDaoFactoryStatic" factory-method="getUserDao"></bean>-->
<!-- 实例化bean之实例工厂复杂版-->
<!-- 先创建userDaoFactory的bean对象-->
<!-- <bean id="userDaoFactory" class="org.example.factory.UserDaoFactory"></bean>-->
<!-- 再创建userDao的bean对象-->
<!-- <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"></bean>-->
<!-- 实例化bean之实例工厂简易版-->
<bean id="userDao" class="org.example.factory.UserDaoFactoryBean"></bean>
</beans>