Spring之Bean注入Spring容器中的方式

 

向spring容器中加入bean有以下方式:
  • 通过<Bean>标签
  • @Configuration + @Bean
  • @Component + 组件扫描
  • @Import导入【见 Spring注解之@Import
  • 实现FactoryBean接口
  • 通过BeanFactory后置处理器BeanFactoryPostProcessor【见Spring之后置处理器- BeanFactoryPostProcessor】

 

通过<Bean>标签
 
在applicationContext.xml中使用<Bean>标签将Bean注入Spring容器。
 
无参构造
<bean id="teacher" class="com.blueStarWei.bean.Person" />
package com.blueStarWei.bean;

import java.io.Serializable;

public class Person implements Serializable {

    private String name;
    private int age;

    //setter

    //getter

}
Person

 

有参构造

<bean id="student" class="com.blueStarWei.bean.Person">
    <constructor-arg name="name" value="Winn" />
    <constructor-arg name="age" value="23" />
</bean>
package com.blueStarWei.bean;

import java.io.Serializable;

public class Person implements Serializable {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

}
Person

 

静态工厂方法

使用场景主要有2种:
    1)创建Bean的时候需要添加额外的逻辑,可以创建自己的静态工厂方法
<bean id="person" class="com.blueStarWei.StaticBeanFactory" factory-method="getPerson"  />
public class StaticBeanFactory {

    public static Person getPerson() {
        System.out.println("static person...");
        return new Person();
    }

}

    2)需要注入第三方的静态工厂方法生成的对象

<bean id="jdbc" class="java.sql.DriverManager" factory-method="getConnection" >
    <constructor-arg name="url"  value="jdbc:mysql://127.0.0.1:3306/db"/>
</bean>

 

实例工厂方法

与静态工厂方法的区别在于:静态工厂的方法是static的,调用的时候不用创建工厂对象;而实力工厂方法在使用的时候必须先创建工厂对象。

<!--先创建工厂实例-->
<bean id="objectBeanFactory" class="com.blueStarWei.ObjectBeanFactory" />
<!--根据实例工厂中的方法创建Bean-->
<bean id="student" factory-bean="objectBeanFactory" factory-method="getPerson" />
public class ObjectBeanFactory {

    public Person getPerson() {
        System.out.println("object person...");
        return new Person();
    }

}

 

@Configuration + @Bean

@Configuration是用来类声明一个配置类,@Bean用来将一个方法的返回值声明为一个Bean,并将其注入Spring容器中

@Configuration
public class MyConfiguration {
    @Bean
    public Person person() {
        Person person = new Person();
        person.setName("BlueStar");
        return person;
    }
}

 

@Component + 组件扫描

@Component将类声明成组件,然后在配置文件中配置组件扫描,组件扫描会将@Component配置的类注入Spring容器中。
package com.blueStarWei.bean;

import org.springframework.stereotype.Component;
import java.io.Serializable;

@Component
public class Person implements Serializable { }
<!--applicaitonContext.xml-->
<context:component-scan base-package="com.blueStarWei" />

 

实现FactoryBean接口
FactoryBean是一个接口,用来定义工厂Bean的规范【开发很少使用,一般在Spring底层中使用】
FactoryBean的实现类本身不会被注册成Bean,而是将getObject()返回的对象注册成Bean。
@Component
public class MyFactoryBean implements FactoryBean<Person> {
    public Person getObject() throws Exception {
        return new Person();
    }

    public Class<?> getObjectType() {
        return Person.class;
    }

    public boolean isSingleton() {
        return true;
    }
}

 

 

posted @ 2022-12-27 09:25  blue星空  阅读(361)  评论(0编辑  收藏  举报