Spring注册bean的三种方式

吕旷
• 阅读 1577

1)无参构造器注册bean

实体类

public class User {
    private String username;
    private String password;

    public User() {
        System.out.println("User类的无参构造方法User()执行了");
    }
    
    public User(String username, String password) {
        System.out.println("User类的有参构造方法User()执行了");
        this.username = username;
        this.password = password;
    }
}

配置文件

<?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
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="entity.User"></bean>

</beans>

测试类

public class TestSpring {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user);
    }
}

输出结果

User类的无参构造方法User()执行了
entity.User@29774679

2)静态工厂方法注册bean

实体类

public class User {
    private String username;
    private String password;

    public User() {
        System.out.println("User类的无参构造方法User()执行了");
    }
    
    public User(String username, String password) {
        System.out.println("User类的有参构造方法User()执行了");
        this.username = username;
        this.password = password;
    }
}

工厂类

public class UserFactory {
    private static User user;

    static {
        user = new User();
    }

    public static User getInstance() {
        return user;
    }
}

配置文件

<?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
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <?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
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- factory-method:用于指定一个静态工厂方法,Spring容器会调用这个静态方法创建个对象。-->
    <bean id="user" class="entity.UserFactory" factory-method="getInstance"></bean>
    
</beans>

</beans>

测试类

public class TestSpring {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user);
    }
}

输出结果

User类的无参构造方法User()执行了
entity.User@5622fdf

3)实例工厂方法注册bean

实体类

java.util.Calendar  
    public final Date getTime()

配置文件

<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 静态工厂方法注册bean -->
    <bean id="calendar" class="java.util.Calendar" factory-method="getInstance"></bean>

    <!-- 
        实例工厂方法注册bean:
            factory-bean:用于指定一个bean的id
            factory-method:用于指定一个方法
    -->
    <bean id="time" factory-bean="calendar" factory-method="getTime"></bean>

</beans>

测试类

@Test
public void test03() {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    Date time = ac.getBean("time",Date.class);
    System.out.println(time);
}

测试结果

Mon Jan 21 00:28:07 CST 2019
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
spring源码解析
前言上篇我们介绍了spring容器加载的方式,并重点介绍了基于xml配置解析和注解扫描两种容器加载的方式,封装和注册beandefinition的过程。今天我们分享BeanDefinition注册后的另一个重要过程bean的实例化过程的源码。容器加载流程!spring源码解析spring容器加载源码(bean实
Easter79 Easter79
3年前
spring注解
随着越来越多地使用Springboot敏捷开发,更多地使用注解配置Spring,而不是Spring的applicationContext.xml文件。Configuration注解:Spring解析为配置类,相当于spring配置文件Bean注解:容器注册Bean组件,默认id为方法名@Configurat
Easter79 Easter79
3年前
Spring学习笔记一
IOC容器里配置beanapplicationContext.xml必须有个无参的构造器class:bean的全类名通过beanid获得这个bean必须唯一spring提供2种IOC容器容器实现方式beanfactory用在spring本身applicationContext用在开发者配置方式相同
Stella981 Stella981
3年前
Spring Ioc工作机制 初步
SpringIoC工作原理Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。!Spring工作原理图(https://oscimg.oschina.net/oscnet/091a
Stella981 Stella981
3年前
Spring Bean注册解析(一)
       Spring是通过IoC容器对Bean进行管理的,而Bean的初始化主要分为两个过程:Bean的注册和Bean实例化。Bean的注册主要是指Spring通过读取配置文件获取各个bean的声明信息,并且对这些信息进行注册的过程。Bean的实例化则指的是Spring通过Bean的注册信息对各个Bean进行实例化的过程。本文主要讲解Spring是如何
Easter79 Easter79
3年前
Spring——多种方式实现依赖注入
  在Spring的XML配置中,只有一种声明bean的方式:使用<bean元素并指定class属性。Spring会从这里获取必要的信息来创建bean。但是,在XML中声明DI时,会有多种可选的配置方式和风格,具体到setter方式、构造器方式和P命名空间方式。一、使用setter进行注入!(https://img2018.c
Wesley13 Wesley13
3年前
Spring常用注解
使用注解来构造IoC容器用注解来向Spring容器注册Bean。需要在applicationContext.xml中注册<context:componentscanbasepackage”pagkage1\,pagkage2,…,pagkageN\”/。如:在basepackage指明一个包
Easter79 Easter79
3年前
Spring容器初始化过程
一、Spring容器高层视图Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。!(http://images2015.cnblogs.com/blog/5
Easter79 Easter79
3年前
Spring实例化Bean的三种方法
实例化Bean有三种方式,分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。本节将针对这三种方式分别进行讲解。构造器实例化构造器实例化是指Spring容器通过Bean对应的类中默认的构造函数实例化Bean。下面通过案例演示如何使用构造器实例化Bean。1\.创建项目并导入JAR包在MyEclipse中
Easter79 Easter79
3年前
Spring高级应用之注入嵌套Bean
在Spring中,如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。和普通的Bean一样,使用<bean元素来定义嵌套的Bean,嵌套Bean只对它的外部的Bean有效,Spring容器无法直接访问嵌套的Bean,因此定义嵌套Bean也无需指定id属性。如下配置片段是一个嵌套Bean的示例:<bean id
Easter79 Easter79
3年前
Spring中你不知道的注入方式
前言    在Spring配置文件中使用XML文件进行配置,实际上是让Spring执行了相应的代码,例如:使用<bean元素,实际上是让Spring执行无参或有参构造器使用<property元素,实际上是让Spring执行一次setter方法    但Java程序还可能有其他类型的语句:调用get
吕旷
吕旷
Lv1
此曲只应天上有,人间能得几回闻。
文章
3
粉丝
0
获赞
0