Spring的对象创建
Spring学习笔记 周芋杉2021/5/15
原理:工厂设计模式,通过反射创建对象。
Spring工厂分类
非web环境:ClassPathXmlApplicationContext
web环境:XmlWebApplicationContext
简单原理
//String Key是从Properties文件读取的键值对,类似Spring的<bean>
public Object getBean (String Key){
Object ret=null;
try {
//通过反射获取对象
Class clazz=Class.forName(env.getProperty(Key));
//底层调用了new
ret =clazz.newInstance();
}catch (Exception e){
e.printStackTrace();
}
return ret;
1.简单对象的创建
简单对象指的是直接通过new就可以得到的对象
步骤:
1.读取配置文件和写入配置文件
2.获取Key-value
3.获取对象内容,一般是为对象内容提供set/get方法
读取配置文件
ApplicationContext context=new ClassPathXmlApplicationContext("/ApplicationContext.xml");
Object object= (Object) context.getBean("object");
写入配置文件
<bean id="object" class="#object的实现类的全限名命"></bean>
获取内容
//直接调用object的get方法
Object object.getxxx();
2.复杂对象的创建
不能通过直接new的对象比如Connection SessionFactory 等
实现复杂对象的方式:
1.FactoryBean
开发步骤
1.实现FactoryBean接口
重写三个方法
2.在配置文件中配置
3.创建和使用
实现FactoryBean接口(例如实现Connection )
//给FactoryBean指定泛型为Connection
public class FactoryBean implements org.springframework.beans.factory.FactoryBean<java.sql.Connection> {
//提供对应的set/get方法方便注入
private String Driver;
private String Url;
private String user;
private String password;
//创建连接复杂对象
@Override
public java.sql.Connection getObject() throws Exception {
Class.forName(Driver);
java.sql.Connection conn = DriverManager.getConnection(Url,user,password);
return conn;
}
//返回值类型是Connection
@Override
public Class<?> getObjectType() {
return Connection.class;
}
//指定是否多次创建
@Override
public boolean isSingleton() {
return false;
}
public String getDriver() {
return Driver;
}
public void setDriver(String driver) {
Driver = driver;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
配置文件中注入,和之前一样
<bean id="conn" class="org.FactoryBean.FactoryBean">
<property name="Driver" value="com.mysql.jdbc.Driver"/>
<property name="password" value="123456"/>
<property name="Url"
value="jdbc:mysql://localhost:3306/jdbc_test"/>
<property name="user" value="root"/>
</bean>
创建和使用
注意:在获取conn时必须加&
public void connectionFactoryBean(){
ApplicationContext context =new ClassPathXmlApplicationContext("/ApplicationContext.xml");
FactoryBean conn= (FactoryBean)context.getBean("&conn");
System.out.println("Conn= "+conn);
}
2.实例工厂创建
目的:
使得老系统整合进Spring
使得Spring没有侵入性
开发步骤:
1.老系统代码
2.在配置文件中配置
例如:
老系统代码,简单的创建连接代码
public class OldFactory {
public Connection getconn() throws ClassNotFoundException, SQLException {
Connection connection=null;
Class.forName("com.mysql.cj.jdbc.Driver");
connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test,"root","atgxstuSf2<e");
return connection;
}
}
在配置文件中
俩步骤
1.配置老代码的工厂
2.在整合配置中使用老代码工厂的id和指定方法
<bean id="oldconn" class="org.FactoryBean.OldFactory"/>
<bean id="Newconn" factory-bean="oldconn" factory-method="getconn"/>
3静态工厂
<bean id="XXX" Class="老代码的类" factory-method="老代码方法"/>