1.主动获取Bean
spring项目在需要时,会自动从IOC容器中获取需要的Bean
我们也可以自己主动的得到Bean对象
(1)获取bean对象,首先获取SpringIOC对象
private ApplicationContext applicationContext //IOC容器对象
(2 )方法1:根据名称获取bean
创建bean对象,没有指定名称时,默认就是 bean的名称 就是 类名的首字母小写
直接获取得到的是Object对象,需要强转
三次运行都只得到一个Bean,说明Bean对象默认是单例的
2.bean的作用域:(知道这两种就行了)
单例的:容器内只有一个单例的Bean
非单例的:每次使用都创建新的bean
下面三种只在web环境中才有,不重要
可以通过@Lazy来延迟加载bean,只有第一次使用时,才会初始化这个bean。(使用不多)
3.第三方bean的配置
我们声明自己的bean对象是用这几个注解,自己的bean对象就是自己写的类,将自己的bean对象交给IOC容器管理,加上这几个注解及其衍生注解
场景:
dem4j是用来解析xml文件的,
我们想要用的话,第一步,先在pom中加入这个dom4j这个依赖
第二步,可以在类中new一个SAXReader对象,然后调用方法就可以使用了
但是我们都是用Spring框架了,这样使用太麻烦了,我们可以把SAXReader交给IOC容器去管理,每次用的时候,直接注入就好了。但是发现SAXReader类并没有加上@component注解生成bean对象,且是只读文件,我们也加不了
所以,我们使用第三方的bean对象,就不能像之前的做法,直接在类上加@component注解生成bean对象了
解决方法:使用第三方的bean
在启动类上加上一个方法(方法名就是第三方类交给IOC管理的bean对象的bean的默认名称),方法返回值(这个类的对象)交给IOC容器管理,成为bean对象。
这个方法必须加上@Bean注解
这样,在其他地方使用这个对象,使用@Autowired注入进来就可以了
和main方法是平行的
但是呢?如果都加到启动类中,启动类就变复杂了,要保证启动类的纯洁,不建议加在启动类中写多余的代码
我们建议在配置类(@Configration)中声明这样一个类,集中管理第三方的bean注入。
在配置类上加上一个方法(方法名是随意的),方法返回值(这个类的对象)交给IOC容器管理,成为bean对象。如果有多个第三方的bean,再定义一个方法,重复这个过程,就可以了
验证:方法名就是 IOC容器中bean的名称
测试:通过主动获取bean对象方法,通过bean的名称获取bean对象,看看能不能获取到?
获取到了,说明 方法名就是 IOC容器中bean的名称
注入第三方bean的时候,如何解决依赖注入的问题?写到形参里就可以了
场景:如果我们在注入第三方bean(SAXReader)的时候,SAXReader还依赖DeptService的bean,怎么办?
只需要把DeptService放到形参的位置,spring就会自动注入DeptService的bean以帮助我们注入第三方bean(SAXReader)
不需要@Autowired手动装配
总结:
(1)如果是自己定义的类,想交给IOC容器管理,就是用@Component注解及其衍生注解
(2)如果是引入第三方的类,想交给IOC容器管理,,并且源码中没有加@Component注解,源码文件又只读不可写,我们也加不了,就要使用@Bean注解,放到配置类中,交给IOC容器管理