从SpringIOC容器中取数据
- 基于配置文件的取数据方式:从applicationContext.xml中取数据,利用ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”)读取配置文件,利用getBean方法取出相应Bean:
Studuent stu = (Student)context.getBean(“student”); - 基于注解的方式取数据方式:前提必须有相应的带有注解的配置类,从配置类中利用注解存入到IOC容器中才能将数据取出,利用ApplicationContext context = new AnnotationConfigApplicationContext(“MyConfig.class”)读取配置文件信息,其中MyConfig.class为配置类的class文件,利用getBean方法取出相应Bean:
Studuent stu = (Student)context.getBean(“student”); - 通过配置文件applicationContext.xml存取Bean与通过注解方式存取Bean是相互独立的(两个不同的容器),存取要保持一致性,否则会存在取不到数据或取出错误数据的情况。
基于注解方式给IOC容器存放Bean
- 前提必须存在带有@Configuration注解的配置类
基于三层组件的存放Bean方式
-
三层组件类型:@Controller、@Service、@Repository、@Component
-
操作步骤
-
将三层组件分别在相应层级中标注
-
将注解所在包,纳入IOC扫描器
- 通过配置文件配置扫描器: 需要在applicationContext.xml中配置<context:component-scan base-package=“需要扫描的包,例如:indi.dsl.controller或者二级目录indi.dsl”></context:component-scan>
- 通过注解形式配置扫描器:需要在带有@Configuration的配置类中,利用@ComponentScan(value=“需要扫描的包”),来配置扫描器
-
基于注解形式的扫描器应用
-
type=FilterType.ANNOTATION类型(三层中某一层类):
- 在注解扫描器中排除三层中某个层:指定某个层被排除@ComponentScan(value=“需要扫描的包”,excludeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,value=Server.class)})
- 只扫描指定的层,使用includeFilters并且必须搭配useDefaultFilters=“False”,屏蔽掉默认设置为true,只扫描指定的层级,如果不设置useDefaultFilters属性为False,则会将所有层级的注释扫描出来。
-
type=FilterType.ASSIGNABLE_TYPE类型,指定某一具体的类:
- 排除时excludeFilters={@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,value=“某个具体的类,例如:StudentController.class”)})
- 包含时includeFilters={@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,value=“某个具体的类,例如:StudentController.class”)})
-
type=FilterType.CUSTOM类型,自定义类型:需要自行定义类方法,并且该方法必须实现TypeFilter接口
- 排除时excludeFilters={@ComponentScan.Filter(type=FilterType.CUSTOM,value={自行定义的方法,例如MyFilter.class)})
- 包含时includeFilters={@ComponentScan.Filter(type=FilterType.CUSTOM,value={自行定义的方法,例如MyFilter.class)})
Bean的作用域
- L如果不指定作用域的情况下,默认是singlton单例的,在IOC容器初始化时就是创建唯一的一个对象,在何时调用getBean方法时,取到的对象都是同一个,并且支持“懒加载”@Lazy,在调用时才会创建对象,初始化时不创建对象。
- prototype原型模式即多实例,可以利用@scope(“prototype”)指定该Bean为多实例作用域,默认在调用时进行对象的创建。每次getBean时都会创建一个新的对象。
非三层组件的存放Bean方式
- @Bean+方法的返回值
- Improt方法在IOC容器中添加Bean:
- 创建普通类,利用@Improt(自定义的普通类:例如Apple.class)
- 自定义ImprotSelector接口的实现类,利用selectImprots()方法,将要存入的Bean全类名作为返回值返回,并用Improt(类名.class)告知程序识别该类。
- 编写ImprotBeanDefinitionRegistra接口的实现类,重写其中方法并用Improt(类名.class)告知程序识别该类。
- FactoryBean(工厂Bean)
- 编写FactoryBean接口的实现类,重写其中方法,在取数据时getBean(“例如:ApplyBean”),取得是真正的AppleBean,如果getBean(“例如:&ApplyBean”),如果加入“&”符号,则是取得实现类的本身。
自动装配@Autowired
- 自动装配@Autowired可以放在属性前,方法前,也可以放在参数中,起到自动装配的的作用,但是放在参数中,要求参数是复杂类型的,并且该参数的来源必须为@Bean+返回值存放在IOC容器中的。
- 如果@Autowired单独使用,是按照类型进行装配的,如果@Autowired和qualifier(“别名”)一起使用,是按照别名的名称,进行装配的。