重学Spring框架系列之——使用Spring创建自定义Bean的实例

本文将为大家讲解一下如何使用Spring创建自定义的类的实例,也就是将自定义的类交由Spring来管理。下面将会通过XML和注解两种形式来进行演示。

环境准备

为了方便,下面将采取Maven项目进行演示。

pom.xml中添加Spring环境的spring-context和用于测试的junit坐标。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13.1</version>
  <scope>test</scope>
</dependency>

用于演示使用Spring创建自定义组件的类

// 1、Person类
public class Person {

  // 姓名
  private String name;

  // 年龄
  private String age;

  // ...get、set方法
}

// 2、PersonController
public class PersonController {

}

// 3、PersonService
public class PersonService {

}

// 4、PersonDao
public class PersonDao {

}

通过bean标签实现

1、创建Spring的配置文件(名beans.xml,该名随意),并通过“”标签配置需要创建的类。

<!-- 配置person类 -->
<bean id="person" class="com.springtest.bean.Person"></bean>

bean标签中常用的属性有

id属性:表示该对象的唯一标识。
class属性:需要创建对象的类对应的全类名。

2、创建测试类,进行测试。

@Test
public void test1() {
    // 创建Spring的IOC容器,读取配置文件beans.xml。
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    // 通过bean的id获取实例。
    Object person = context.getBean("person");
    // 也可以通过bean的类型: context.getBean(Person.class);
    System.out.println(person);
}

3、测试结果为获取成功。

在这里插入图片描述

注意:因为spring默认使用的是无参构造创建的实例,所以必须确保要创建的实体类中有无参构造,否则将会报错。

在这里插入图片描述

通过配置文件加注解的方式实现

Spring提供了四个注解用于创建对象

@Controller:使用在Web层。
@Service:使用在业务(service)层。
@Repository:使用在持久(dao)层。
@Component:表示普通组件。

说明:这四个注解的valeu属性就是标注bean的id的。等价于配置文件中bean标签的id属性。value属性也可以省略不写,如果省略则id使用的是类名的首字母小写。

1、要想使用这些注解创建对象,那就必须在配置文件中开启组件扫描。

开启组件扫描之前需要先引入context名称空间

在这里插入图片描述

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

开启组件扫描。

<!-- 方式一:如需要扫描多个包,可以使用逗号(,)将多个包隔开 -->
<context:component-scan base-package="com.springtest.controller,com.springtest.service"/>
<!-- 方式二:可直接扫描多个包的上级目录 -->
<context:component-scan base-package="com.springtest"/>

2、在需要创建实例的类上添加对应的注解。

@Component
public class Person {
  // ...省略其它代码
}

@Controller
public class PersonController {

}

@Service
public class PersonService {

}

@Repository(value = "personDao")
public class PersonDao {

}

3、测试代码

@Test
public void test2() {
    // 读取配置文件beans.xml,创建Spring的IOC容器。
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    // 通过bean的id获取实例。
    Object person = context.getBean("person");
    System.out.println(person);
    // 通过bean的类型获取实例
    PersonController personController = context.getBean(PersonController.class);
    System.out.println(personController);
    // 通过bean的id加类型获取实例
    PersonService personService = context.getBean("personService", PersonService.class);
    System.out.println(personService);
    /**
     * 注意:PersonDao类的@Repository注解指定了value属性,
     *      获取对象时就不能在使用默认值了,需要使用value属性规定的值。
     */
    Object personDao = context.getBean("personDao");
    System.out.println(personDao);

}

4、执行结果

在这里插入图片描述

全注解方式实现

全注解形式是通过@Configuration注解替换掉原来的xml配置文件的。

@Configuration注解的作用就是告诉Spring标注了这个注解的类是一个配置类,它等价于原来的一个配置文件。

1、编写配置类。

通过@ComponentScan注解配置开启组件扫描。
通过@Bean注解在IOC容器中注入一个实例,也就是创建一个实例。

/**
 * @Configuration注解用于告诉spring这是一个配置类。
 * @ComponentScan注解用于开启组件扫描。
 *    @ComponentScan(basePackages = {"com.springtest"})就等价于在配置
 *    文件中写“<context:component-scan base-package="com.springtest"/>”
 *    basePackages属性的写法跟配置文件的一样,也可以写多个扫描包,多个包之间用逗号隔开
 */
@Configuration
@ComponentScan(basePackages = {"com.springtest"})
public class MainSpringConfig {

}

2、在配置类中通过@Bean注解注入一个实例。

作用:将@Bean注解标注在方法上,用于向IOC容器中注入一个bean,这个bean的类型就是方法的返回值类型,bean的id默认使用的是方法的名称,也可以通过valeu属性或name属性指定。

@Bean(value = "person2")
public Person person() {
    return new Person();
}

3、在需要创建实例的类上添加对应的注解。跟上面通过配置文件加注解的方式一样,使用的也是相同的代码就在此处赘述。

4、进行测试。

@Test
public void test3() {
    // 读取MainSpringConfig配置类,创建Spring的IOC容器
    ApplicationContext context = new AnnotationConfigApplicationContext(MainSpringConfig.class);
    // 通过bean的id加类型获取实例,获取标注了@Service注解的personService实例
    PersonService personService = context.getBean("personService", PersonService.class);
    System.out.println(personService);
    // 通过id名称获取@Bean注解的person2实例
    Object person2 = context.getBean("person2");
    System.out.println(person2);
}

5、测试结果。

在这里插入图片描述

通过Spring的FactoryBean接口实现

编写org.springframework.beans.factory.FactoryBean接口的实现类,用于注入Bena。

1、编写FactoryBean接口的实现类。

public class PersonFactory implements FactoryBean<Person> {

  // 通过该方法向IOC容器中注入一个Person的实例
  public Person getObject() {
    return new Person();
  }

  // 设置注入bean的类型
  public Class<?> getObjectType() {
    return Person.class;
  }

  // 设置是否单例,默认是true。
  public boolean isSingleton() {
    return true;
  }
}

2、将PersonFactory注入到Spring的IOC容器中,下面使用的@Bean注解的方式。

1、注入bean的id默认是方法名,可通过@Bean注解的value或name属性进行修改。
2、注入bean的类型是PersonFactory的getObject方法的返回值类型也就是Person。
3、通过id(personFactory)获取到的bean实例是Person类型的,如果想要获取PersonFactory的bean实例需要在注入的bean的id加上前缀【&】作为id。这个前缀是在org.springframework.beans.factory.BeanFactory接口规定的。

@Bean
public PersonFactory personFactory() {
    return new PersonFactory();
}

3、测试获取实例。

@Test
public void test4() {
    // 读取MainSpringConfig配置类,创建Spring的IOC容器
    ApplicationContext context = new AnnotationConfigApplicationContext(MainSpringConfig.class);
    // 获取工厂类创建的实例
    Object person = context.getBean("personFactory");
    System.out.println(person);
    // 获取工厂类的实例
    Object personFactory = context.getBean("&personFactory");
    System.out.println(personFactory);
}

4、测试结果。

在这里插入图片描述

这就是常用的几种使用Spring创建自定义bean的实例的方式。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值