spring创建bean的最详细的方式

说白了就是创建对象交给spring管理 或者让spring帮你创建这个对象

本文将以最详细的方式一一列举

  1. xml中直接定义bean 通过其构造函数创建bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- xml 中bean创建的几种方式 -->
    <!--1、直接定义bean -->
    <bean id="myBean1" class="com.lgj.spring.createbean.xml.MyBean1"/>
</beans>
  1. 利用factorybean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--2、利用factorybean -->
    <bean id="myBean2" class="com.lgj.spring.createbean.xml.MyFactoryBean"/>
</beans>
public class MyFactoryBean  implements FactoryBean<MyBean1> {
    @Override
    public MyBean1 getObject() throws Exception {
        return new MyBean1();
    }

    @Override
    public Class<?> getObjectType() {
        return MyBean1.class;
    }
}

  1. 静态方法创建bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--3、静态方法创建bean -->
    <bean id="myBean3" class="com.lgj.spring.createbean.xml.MyBeanInXml" factory-method="createSMybean1"/>
</beans>
public class MyBeanInXml {

    /**
     * 静态方法创建bean
     */
    public static MyBean1 createSMybean1(){
        return new MyBean1();
    }
}
  1. 非静态方法创建bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--4、普通实例化方法创建bean -->
    <bean id="factoryBean" class="com.lgj.spring.createbean.xml.MyBeanInXml"/>
    <bean id="myBean4" factory-bean="factoryBean" factory-method="createMybean1"/>
</beans>
public class MyBeanInXml {
    /**
     * 非静态方法创建bean
     */
    public MyBean1 createMybean1(){
        return new MyBean1();
    }
}
  1. 利用常用注解@Component、@Service等等

@Component
public class MyBean {
}
  1. 利用@Bean注解

@Bean
public MyBean1 myBean1(){
    return new MyBean1();
}
  1. 利用import注解 直接引入该类

@Import(MyBean2.class)
  1. 利用import注解 的ImportSelector

public class MyImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[] {MyBean3.class.getName()};
    }

}

@Import(MyImportSelector.class)
  1. 利用import注解 的ImportBeanDefinitionRegistrar 注入beanDefinition

public class MyImportRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition bd = new RootBeanDefinition();
        bd.setBeanClass(MyBean4.class);
        registry.registerBeanDefinition("myRegistrarBean4", bd);
    }
}
@Import(MyImportRegistrar.class)
  1. 利用beanFactoryPostProcessor 注入beanDefinition

@Component
public class MyBeanFactoryBeanProcessor extends ConfigurationClassPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        RootBeanDefinition bd = new RootBeanDefinition();
        bd.setBeanClass(MyBean5.class);
        registry.registerBeanDefinition("registerBeanDefinition",bd);
    }
}
  1. 利用beanFactory 注入beanDefinition

@Component
public class MyBeanFactory implements BeanFactoryAware {
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
        RootBeanDefinition bd = new RootBeanDefinition(MyBean6.class);
        listableBeanFactory.registerBeanDefinition("byBeanFactory",bd);
    }
}
  1. 自定义bean标签 还是注入beanDefinition

\src\main\resources\META-INF目录下新建三个文件:

1、spring.handlers

http\://www.custombean.com/schema/user=com.lgj.spring.createbean.xml.customtag.MyCustomTagHandler

2、spring.schemas

http\://www.custombean.com/schema/user.xsd=META-INF/spring-user.xsd

3、spring-user.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.custombean.com/schema/user"
        elementFormDefault="qualified">
    <element name="user">
        <complexType>
            <attribute name="id" type="string"></attribute>
            <attribute name="username" type="string"></attribute>
            <attribute name="password" type="string"></attribute>
            <attribute name="age" type="int"></attribute>
        </complexType>
    </element>
</schema>
MyCustomTagHandler
public class MyCustomTagHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        registerBeanDefinitionParser("user",new UserBeanDefinitionParser());
    }
}

User
public class User {

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String id;
    private String username;
    private String password;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

UserBeanDefinitionParser
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    @Override
    protected Class<?> getBeanClass(Element element) {
        return User.class;
    }

    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
        String id = element.getAttribute("id");
        String username = element.getAttribute("username");
        String age = element.getAttribute("age");
        String password = element.getAttribute("password");
        builder.addPropertyValue("id",id);
        builder.addPropertyValue("username",username);
        builder.addPropertyValue("password",password);
        builder.addPropertyValue("age",age);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:test="http://www.custombean.com/schema/user"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.custombean.com/schema/user
       http://www.custombean.com/schema/user.xsd">

    <!--自定义标签-->
    <test:user id="customTag" username="test" password="password1" age="13"/>
</beans>

附启动类

public class CreateBeanMain {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:createBeanContext.xml");
        System.out.println(applicationContext.getBean("myBean1"));
        System.out.println(applicationContext.getBean("myBean2"));
        System.out.println(applicationContext.getBean("myBean3"));
        System.out.println(applicationContext.getBean("myBean4"));
        System.out.println(applicationContext.getBean("customTag").toString());
    }
}

public class CreateBeanWithAnnoMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(CreateBeanConfig.class);
        //1、利用bean注解
        System.out.println(applicationContext.getBean("myBean1"));
        //2、利用component等相关注解
        System.out.println(applicationContext.getBean("myBean"));
        //3、利用import注解 直接引入该类
        System.out.println(applicationContext.getBean(MyBean2.class));
        //4、利用import注解 的ImportSelector
        System.out.println(applicationContext.getBean(MyBean3.class));
        //5、利用import注解 的ImportBeanDefinitionRegistrar 注入beanDefinition
        System.out.println(applicationContext.getBean("myRegistrarBean4"));
        //6、利用beanFactoryPostProcessor
        System.out.println(applicationContext.getBean("registerBeanDefinition"));
        //7、利用beanFactory 注入beanDefinition
        System.out.println(applicationContext.getBean("byBeanFactory"));

    }
}

@Configuration
@ComponentScan("com.lgj.spring.createbean.annotation")
@Import({MyBean2.class,MyImportSelector.class,MyImportRegistrar.class})
public class CreateBeanConfig {
    @Bean
    public MyBean1 myBean1(){
        return new MyBean1();
    }
}

如有遗漏 欢迎补充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值