一文带你了解Spring中存入Bean和获取Bean的方式 |
您所在的位置:网站首页 › 获取bean对象的方式 › 一文带你了解Spring中存入Bean和获取Bean的方式 |
0. Spring中的五大注解
Spring既然是一个包含众多工具方法的IoC容器,它是一个控制反转的容器,所以就需要将Bean对象存入到容器中,需要用的时候从容器中获取Bean对象,下面我们来介绍下存入Bean对象。 1.1 在 xml 中存入 Bean 对象 // 这句代码中, id 就是给 这个要注入的对象取个名字, class就是 要存入的 Bean 的类型是哪一个配置了 Bean 的扫描路径,只有当前目录下的类才会被扫描是否加了类注解,如果加了类注解后,就会将 所有加了类注解的类 存入到 IoC 容器中。 @Component public class User { public void say(){ System.out.println("Hello User..."); } }类注解存Bean需要注意几点 如果类名为大驼峰命名规则,那么获取 Bean 的默认名称,就是 类名首字母小写如果不满足首字母大写,第二个字母小写,那么 Bean 的名称,就是原类名,这点可以看源码知道![]() 在上述代码中,我们可以通过 在方法上 加上 @Bean 注解 将该方法存入到 IoC 容器中,并且可以直接获取到该对象。 在使用 @Bean 注解的时候,需要注意几点 @Bean 注解必须配合 五大类注解一块使用@Bean 注解的默认命名 = 方法名称如果使用 @Bean(“xxxx”)方式,那么名称就是 xxxx, 并且 @Bean({“xxx”,“xxxxx”,“xxxxxx”}),里面可以类似和数组一样多个名称如果@Bean重命名后,那么默认的方法名就没用,获取Bean的时候就不能写默认方法名如果多个 Bean 使用相同的名称,则不会报错,只会存储第一个 Bean对象,之后相同名称的不会存入,会自动忽略 2. 获取 Bean 2.1 依赖查找(DF)依赖查找(依赖Bean的名称),有两种方式,一种是 ApplicationContext, 一种是 BeanFactory。这两种都是容器管理对象,都可以获取到 Bean对象 2.11 ApplicationContext public class App { public static void main(String[] args) { // 1. 获取 Spring 上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); // 2。获取 Bean 对象 Student student = (Student) context.getBean("student"); System.out.println(student); } } 2.12 BeanFactory public static void main(String[] args) { // 1. 得到 spring 上下文对象 BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml")); // 2. 获取 Bean 对象 //Student student = (Student)context.getBean("user"); Student student = (Student)context.getBean("student"); System.out.println(student.toString()); } 2.13 Application VS BeanFactory ApplicationContextBeanFactoryApplicationContext是BeanFactory的子类,其拥有更多功能(国际化支持、资源访问支持、事件传播)BeanFactory是ApplicationContext的父类ApplicationContext加载Bean:一次性加载所有Bean对象BeanFactory加载Bean:懒加载,按需加载(使用一个加载一个)在 spring 中实现依赖注入的常见方式有3种: 1.属性注入2.setter注入3.构造方法注入 2.21 属性注入 @Controller public class UserController { /** * 属性注入 */ @Autowired private UserService userService; // 此处 main方法里面,必须使用依赖查找的方式,先获取到UserController public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserController userController = (UserController) context.getBean("userController"); userController.userService.say(); } }属性注入: 优点: 实现简单、使用简单,只需要在属性上加一个注解@Autowired,就不需要自己new一个对象,直接获得注入的对象。 缺点: 无法注入一个用 final 修饰的对象![]() 优点:似乎没什么优点,而且比属性注入更加麻烦,要说唯一可能有用的就是,完全符合单一职责设计原则,每个 setter 只针对一个对象。Setter注入 也适用于非IoC容器 缺点: 不能注入 final 对象![]() 优点: 可以注入 被final 修饰的对象 注入对象不会被更改,因为是在构造方法注入的,构造方法在对象创建的时候只会创建一次 注入的对象会被完全初始化 通用性会更好,无论在 IoC容器 还是 非 IoC容器中都能用 缺点: 写法更加复杂使用构造方法,无法解决循环依赖的问题Spring官方推荐的是构造方法的注入,可以注入不可变对象,通用性更好;如果想要注入可变对象,那么可以使用 Setter 注入。 3. 解决同一类型多个 Bean 的报错问题
![]() ![]() 出身不同:@Resource来自于JDK,@Resource来自于Spring 支持参数不同:@Resource支持更多的参数 使用上的区别:@Resource不支持构造方法的注入 兼容性问题:@Autowired在社区版 IDEA可能会误报; |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |