Spring注解驱动开发——组件注册方法

1、@configuration和@Bean注解配合使用

首先建一个maven工程,导入Spring的几个核心包:

Spring注解驱动开发——组件注册方法_第1张图片

然后写一个配置类:

package com.xnn.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

import com.xnn.bean.Person;

/**
 * 类(接口)描述:
 * @author xnn
 * 2019年1月31日下午10:35:57
 */
@Configuration
public class MainConfig {
	@Bean("ojpxdjpogdplh")
public Person getPeerson() {
	return new Person("lisi",32);
}
}

所有的注解配置都可在此类中完成。

测试:

package com.xnn;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.xnn.bean.Person;
import com.xnn.config.MainConfig;
import com.xnn.config.MainConfig2;


/**
 * 类(接口)描述:
 * @author xnn
 * 2019年1月31日下午10:31:30
 */
public class MainTest {
	//加载配置文件,用AnnotationConfigApplicationContext 参数传入配置类的字节码文件
	 AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(MainConfig.class);;
	@Test
	public void test() {
		Person person = context.getBean(Person.class);
		System.out.println(person);
		String[] type = context.getBeanNamesForType(Person.class);
		for (String string : type) {
			System.out.println(string);
		}
	}
	
}
	

结果:

Spring注解驱动开发——组件注册方法_第2张图片

Spring注解驱动开发——组件注册方法_第3张图片

2、@ComponentScan自动扫描组件

用于配置类上面,指定扫描的包路径后,Spring回去寻找带有@Service @Controller @Repository等上面标有注解的类,并把他们装配到Spring容器中去。

Spring注解驱动开发——组件注册方法_第4张图片

  2.1 用@ComponentScan还可以指定扫描规则

  用的是componentScan注解中的一个属性值(excludeFilters={})

Spring注解驱动开发——组件注册方法_第5张图片

FilterType枚举类有下面这几个值:

Spring注解驱动开发——组件注册方法_第6张图片

其中CUSTOM是自定义过滤规则

用法:写个类实现TypeFilter接口

Spring注解驱动开发——组件注册方法_第7张图片

在包扫描配置中把他配上

Spring注解驱动开发——组件注册方法_第8张图片

相对应的还有个includeFilters属性值,含义是只包含这些类。

2.2 @ComponentScan注解是一个可重复的注解

j即可以在一个类上多次标注

Spring注解驱动开发——组件注册方法_第9张图片

3、组件的作用域(@Scope)

一般是在获取Bean的方法声明的头上,取值有:singleton(单实例)、prototype(多实例)、request(同一个请求创建一个实例)、session(同一个session一个实例),默认为singleton(单例)即只写个@Scope的话,则这个就是单实例的Bean,单实例的Bean一般会在容器启动的时候就会去实例化这个Bean

Spring注解驱动开发——组件注册方法_第10张图片Spring注解驱动开发——组件注册方法_第11张图片

Spring注解驱动开发——组件注册方法_第12张图片

如果是多例(prototype),则在Spring容器启动的时候不会实例化该Bean,只有在向容器获取的时候,才会实例化该Bean

Spring注解驱动开发——组件注册方法_第13张图片

Spring注解驱动开发——组件注册方法_第14张图片

如果你既想让Bean是单例的,又不想在Spring容器启动的时候,就去实例化Bean ,可以在此实例化Bean的方法上再添加一个注解(@Lazy(懒加载))。如下图:
Spring注解驱动开发——组件注册方法_第15张图片

4、按照条件给容器注册Bean(@conditional)

用法:    @Conditional(value= {WindowsConditional.class(WindowsConditional.class自己写的实现conditional接口的实现类)}),值可以是一个数组,根据此类的人条件决定注入那个Bean

示例如下:
 Spring注解驱动开发——组件注册方法_第16张图片

Spring注解驱动开发——组件注册方法_第17张图片

根据返回true or false 来决定是否注入。

5、快速给容器导入一个组件——@Import的使用(VALUE值可为数组)

意思就是,被导入的这个组件,没有用前面所说的那几种方式注入到容器,只不过是在配置类的类声明上写上这样一个注解,此时该组件就会注入到Spring容器中去了。组件名默认为组件的全类名。

Spring注解驱动开发——组件注册方法_第18张图片

Spring注解驱动开发——组件注册方法_第19张图片

Spring注解驱动开发——组件注册方法_第20张图片

5.1、ImportSelector的使用

用法:

      需要自己写一个类实现spring容器中的ImportSelector接口中的selectImports()方法。

Spring注解驱动开发——组件注册方法_第21张图片

然后把该类的class字节码文件写在@Import注解的VALUE值上

5.2、ImportBeanDefintionRegistrar的使用

             还是先写一个实现类实现spring中的ImportBeanDefinitionRegistrar的registerBeanDefinitions()方法

Spring注解驱动开发——组件注册方法_第22张图片

然后

至此,就实现了手工的方式注入。

6、使用FactoryBean注册组件

用法:自己写一个类实现Spring中的FactoryBean接口的三个方法

Spring注解驱动开发——组件注册方法_第23张图片

然后在主配置类中把上面的类作为组件配置到Spring中去

Spring注解驱动开发——组件注册方法_第24张图片

测试:
Spring注解驱动开发——组件注册方法_第25张图片

Spring注解驱动开发——组件注册方法_第26张图片

你可能感兴趣的:(框架)