文章目录
昏黄色系的街道上,并没有太多的色彩,唯有这座支在废瓦堆旁的小摊,像仙人掌上的一朵红花,点亮了整片沙漠的活力。
前言(代码结构)
一、构造方法实例化bean(实用)
1.代码:
BookDaoImpl类:
package com.hewen.dao.impl;
import com.hewen.dao.BookDao;
/**
* @author heWen
*/
public class BookDaoImpl implements BookDao {
/**无参构造器,创建对象时必须要用,在此处代码如果运行了,就代表创建对象时运行了此代码,对于构造器的理解看看example
公共的和私有的都可以访问, 有无都可以 1.结论:实例化bean就是用构造方法来实例化对象**/
public BookDaoImpl() {
System.out.println("book dao 构造器 is running ....");
}
@Override
public void save() {
System.out.println("book dao save ...");
}
}
BookDao接口:
package com.hewen.dao;
public interface BookDao {
public void save();
}
AppForInstanceBook:
package com.hewen;
import com.hewen.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceBook {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
xml配置:
2.运行结果:
3.实例化说明:
构造方法实例化bean使用了无参构造器,可以省略无参构造器的书写。实例化bean就是用构造方法来实例化对象。
二、使用静态工厂实例化bean(了解)
1.代码
OrderDaoFactory类:
package com.hewen.factory;
import com.hewen.dao.OrderDao;
import com.hewen.dao.impl.OrderDaoImpl;
/**静态工厂创建对象
* @author heWen*/
public class OrderDaoFactory {
/**一个方法,返回OrderDao对象的方法*/
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}
AppForInstanceOrder类:
package com.hewen;
import com.hewen.dao.OrderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceOrder {
public static void main(String[] args) {
//通过静态工厂创建对象
// OrderDao orderDao = OrderDaoFactory.getOrderDao();
// orderDao.save();
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
orderDao.save();
}
}
xml配置:
2.运行结果:
3.实例化说明:
工厂模式可以实现解耦,用于生成实例对象,所有的方法必须是static。class必须是工厂类,factory-method后接工厂类中的创建对象的方法。
三、使用实例工厂实例化bean(了解)
1.代码:
UserDaoFactory类:
package com.hewen.factory;
import com.hewen.dao.UserDao;
import com.hewen.dao.impl.UserDaoImpl;
/**
* @author heWen
*/ //实例工厂创建对象
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
AppForInstanceUser类:
package com.hewen;
import com.hewen.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceUser {
public static void main(String[] args) {
// //创建实例工厂对象
// UserDaoFactory userDaoFactory = new UserDaoFactory();
// //通过实例工厂对象创建对象
//因为是非静态的,用工厂对象.方法 用工厂的对象调方法
// UserDao userDao = userDaoFactory.getUserDao();
// userDao.save();
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}
xml配置:
2.运行结果:
3.实例化说明:
比较与上一个,在UserDaoFactory类中使用了实例化的方法,先要把工厂的实例化对象造出来,再使用工厂类中的方法。
四、使用FactoryBean实例化bean(三改)(常用)
1.代码:
UserDaoFactoryBean类:
package com.hewen.factory;
import com.hewen.dao.UserDao;
import com.hewen.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;
//FactoryBean创建对象
/**FactoryBean<>,泛型中你想让它造什么对象,就填什么*/
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
/**代替原始实例工厂中创建对象的方法(UserDaoFactory中的方法)*/
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
/**这个对象是什么类型的?就是UserDao类型,就直接放入UserDao的字节码即可*/
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
}
AppForInstanceUser类:
package com.hewen;
import com.hewen.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppForInstanceUser {
public static void main(String[] args) {
// //创建实例工厂对象
// UserDaoFactory userDaoFactory = new UserDaoFactory();
// //通过实例工厂对象创建对象
//因为是非静态的,用工厂对象.方法 用工厂的对象调方法
// UserDao userDao = userDaoFactory.getUserDao();
// userDao.save();
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}
xml配置:
2.运行结果:
3.实例化说明:
在方法三中配置时出现了以上的问题,于是使用方法四实现FactoryBean<>接口。同时既然造出了对象,通过以下方法查看是否单例?
由结果可得是单例。在UserDaoFactoryBean类中重写isSingleton()方法可改为非单例。
。