spring 注入 spring创建复杂对象 和简单对象

一   spring 注入的基本使用

1 set方式注入             配置文件  <property><value>  标签来注入

<bean id="person" class="xxx.Person">
<property name="id" value="10"/>
 <property name="name" value="zhangsan"/>
</bean>

2构造器方式注入       

public class Person {
    private String id;
    private String name;

    public Person(String id, String name) {
        this.id = id;
        this.name = name;
    }
}
<bean id="person" class="xxx.Person">
    <constructor-arg> <value>20</value> </constructor-arg>
    <constructor-arg> <value>zhangsan</value> </constructor-arg>
</bean>

一般来说使用set注入,因为构造注入麻烦,有重载的问题     spring底层框架大量使用set注入

 

一般对象,可以直接通过new构造器创建对象,Person   PersonDao  

复杂对象,不能通过直接new构造器方法创建对象,如connection \ sqsessionFactory

class.forname("com.mysql.jdbc.Driver")
conn = DriverManager.getConnection();

SqlsessionFactory  
inputStream  inputStream = Resouce.getResourcrAsStream();
new SqlSessionFactoryBuilder().build(inputstream);

二     spring工厂创建复杂对象的4种方式

         1)实现factoryBean接口

public class ConnectionFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        //书写创建负责对象的代码,并把复杂对象作为返回值 返回
        Class.forName("com.mysql.jdbc.Deiver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
        return connection;
    }

    @Override
    public Class<?> getObjectType() {
        //返回所创建复杂对象的class对象
        return Connection.class;
    }

    @Override
    public boolean isSingleton() {
        //每一次调用都需要创建一个新的复杂对象
        return false;
    }
}
<bean id="conn" class="com.demo.ConnectionFactoryBean">
 @Test
    public void test1(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
        Connection connection = (Connection) applicationContext.getBean("conn");
        ConnectionFactoryBean connectionFactoryBean = (ConnectionFactoryBean) applicationContext.getBean("&conn");
        System.out.println(connection); //打印connection对象
        System.out.println(connectionFactoryBean);//打印connectionFactoryBean对象
    }

     2)实列工厂   

        避免spring框架的侵入      整合遗留系统(拿不到源码) 

         同下面的普通工厂

     3)静态工厂

        同下面的静态工厂

     4)使用@Configuration  @Bean方式

@Configuration
public class ConfigurationDemo {
    @Bean
    public Connection connection(){
        Connection connection =null;
        try {
            Class.forName("com.mysql.jdbc.Deiver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }
}

 

三     spring 创建bean的三种方式

1 使用默认构造器函数创建  在spring的配置中使用bean标签 配以id和class属性之后,且没有其他属性和标签时,采用的是默认构造器创建bean,此时如果类中没有默认构造器,则对象无法创建

<bean id="XX" class="com.XXX.类名"></bean>

2 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)

public class InstanceFactory{
    publice Connection getConnectionInstance(){
        Class.forName("com.mysql.jdbc.Deiver");
        Connection connection =       
        DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
        return connection;
    }
    
}
<bean id="instanceFactory" class="com.xxx.factory.InstanceFactory"></bean>
<bean id="conn" factroy-bean="instanceFactory" factory-method="getConncetionInstance"></bean>

3使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)

public class StaticFactory{
    publice static IAccountService getConncetionInstance(){
        Class.forName("com.mysql.jdbc.Deiver");
        Connection connection = 
        DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
        return connection;
    }
    
}
<bean id="conn"class="com.xxx.StaticFactory" factory-method="getConncetionInstance"></bean>

 

 public void test1(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
        Connection connection = (Connection) applicationContext.getBean("conn");
        
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值