2Spring对象创建小结

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="老代码方法"/>
posted on 2021-05-22 17:05  NathenJames  阅读(43)  评论(0编辑  收藏  举报