本文将为大家讲解一下如何使用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的实例的方式。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。