一、对象分类
简单对象:使用new Obj()方式创建的对象 复杂对象:无法使用new Obj()方式创建的对象。例如: 1. AOP创建代理对象。ProxyFactoryBean; 2. Mybatis中的SqlSessionFactoryBean; 3. Hibernate中的SessionFactoryBean。
二、创建对象方式
2.1 简单对象创建方式
在Spring框架中, 通过@Commonent,@Service,@Controller等注解创建的都属于简单对象, 底层是采用了Java反射机制来创建对象
2.2 复杂对象创建方式
2.2.1 FactoryBean
FactoryBean是Spring原生提供的创建复杂对象的方式。源码为:
public interface FactoryBean{ /** * 返回要创建的目标对象 */ @Nullable T getObject() throws Exception; /** * 返回目标对象的Class对象 */ @Nullable Class> getObjectType(); /** * bean是否为单例的 **/ default boolean isSingleton() { return true; } }
以创建Connection对象为例:
1. 实现FactoryBean接口 public class ConnectionFactoryBean implements FactoryBean{ /** * 抽出属性,将属性的配置放到配置文件中,体现了依赖注入的思想 */ @Value("${mysql.connector.driverClassName}") private String driverClassName; @Value("${mysql.connector.url}") private String url; @Value("${mysql.connector.username}") private String username; @Value("${mysql.connector.password}") private String password; @Override public Connection getObject() throws Exception { Class.forName(driverClassName); Connection conn = DriverManager.getConnection(url, username, password); return conn; } @Override public Class> getObjectType() { return Connection.class; } @Override public boolean isSingleton() { return false; } } 2.放到配置文件中 3.从容器中获取Connection对象 Application ctx = ...; Connection conn = (Connection) ctx.getBean("conn"); 若想获取ConnectionFactoryBean对象,可通过以下方式: Connection conn = (Connection) ctx.getBean("&conn");
FactoryBean调用的方式是经典的接口回调机制。整体流程为:
2.2.2 实例工厂
实例工厂方式主要为了解决以下问题:
1. 解决Spring框架的侵入,强依赖Spring的FactoryBean接口 2. 整合遗留的老系统。例如:老系统中存在创建某个对象的方式,但不是Spring方式
非整合Spring创建复杂对象的方式为:
public class InstanceFactoryBean { public Connection getConn() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "123456"); return conn; } } 语法:1. 先创建工厂的Bean对象 2. 然后创建具体的Connection对象
2.2.3 静态工厂
和实例工厂解决的问题类似,只不过创建Connection对象采用静态方法。例如:
public class StaticFactoryBean { public static Connection getConn() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "123456"); return conn; } } 语法:
还没有评论,来说两句吧...