5. 通过Spring创建对象
创建Maven Project,在创建过程中,勾选Create a simple project,Group Id填为cn.tedu,Artifact Id填为spring01,其它项保持默认即可。
使用Spring框架时,必须在项目的pom.xml中添加spring-context的依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency>
首先,在项目中,创建cn.tedu.spring
包,并在这个包下创建BeanFactory
类:
package cn.tedu.spring; public class BeanFactory { }
当前,代码放在哪个包中并不重要,应该养成习惯,每个类都应该放在某个包中,不要让任何类不放在任何包中!
以上类的名称也不重要,是自定义的!
如果希望由Spring来创建并管理某个类的对象,必须在以上类中添加方法,关于这个方法:
应该使用public权限;
返回值类型就是需要Spring创建并管理的类的对象的类型;
方法名称可以自定义;
参数列表暂时为空;
在方法体中,自行编写创建返回值对象的代码。
假设需要Spring来创建Date类型的对象,则在类中添加方法:
public Date aaa() { // 规范,规则 }
Spring框架要求:创建对象的方法必须添加@Bean注解,并且,这样的方法必须在配置类中!任何一个类添加了@Configuration注解都可以作为配置类!
package cn.tedu.spring; @Configuration public class BeanFactory { @Bean public Date aaa() { return new Date(); } }
完成后,应该使用一个可以运行的类,或通过单元测试来检验“是否可以通过Spring容器获取对象”。本次先创建一个可以运行的类:
package cn.tedu.spring; public class SpringTests { public static void main(String[] args) { // 1. 加载配置类,得到Spring容器 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanFactory.class); // 2. 从Spring容器中获取所需要的对象 Date date = (Date) ac.getBean("aaa"); // getBean()方法的参数就是创建对象的方法的名称 // 3. 测试获取到的对象 System.out.println(date); // 4. 关闭 ac.close(); } }
6. 关于@Bean注解
当方法的声明之前添加了@Bean注解,就表示这个方法是需要由Spring框架所调用,并且,由Spring框架管理该方法返回的对象的!默认情况下,该方法的名称就是后续获取对象时,调用getBean()方法的参数!
由于添加了@Bean注解的方法是被Spring框架调用的,不需要自行编写代码来调用这个方法,所以,Spring的建议是“使用合理的属性名称作为方法名,并不需要使用动词或动词为前缀的方法名”,简单的说,如果方法是为了获取Date类型的对象的,该方法的名称应该是date,而不是getDate(),则后续调用getBean()时,参数就是date这个名称!
当然,如果不遵循Spring的建议,还可以在@Bean注解中配置注解参数来指定Bean的名称,例如:
@Bean("date") public Date getDate() { return new Date(); }
其关系如下图:
其实,在开发项目时,真的不必关心这些问题,也就是说,例如是一个获取Date
对象的方法,其名称到底是date
还是getDate
都是正确的!毕竟这个方法最终就是由Spring框架来调用,开发人员不会自行调用该方法!