spring给容器注册组件 的几种方式
环境搭建: 新建一个maven项目,引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.7.RELEASE</version> </dependency> 创建一个简单的类Person package com.yang.spring.domain; public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { System.out.println("我被初始化了............"); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
1.使用传统的xml进行配置
<bean id="xiaohui" class="com.yang.spring.domain.Person">
<property name="name" value="yangxiaohui"></property>
<property name="age" value="20"></property>
</bean>
创建一个测试类
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Person p = (Person) ctx.getBean("xiaohui");
System.out.println(p);
}
}
2.使用注解@Bean的方式
@Configuration
public class Configurate {
@Bean
public Person person(){
return new Person("xiaoMing",22);
}
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
Person p = (Person) ctx.getBean("person");
System.out.println(p);
}
}
3.使用@Import注解 @Import({Person.class}) public class Configurate { } public class App { public static void main( String[] args ) { ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class); String[] beanDefinitionNames = ctx.getBeanDefinitionNames(); Person person = ctx.getBean(Person.class); System.out.println(person); for (String definitionName : beanDefinitionNames) { System.out.println(definitionName); //com.yang.spring.domain.Person } } } @Import注解 和@Bean注解区别:@bean注入spring容器的对象,其beanName是方法名,而@Import注解注入的对象的beanName是类的全限定类名
4.@Import的另外一种方式
public class MyImport implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
String[] kk = new String[1];
kk[0]="com.yang.spring.domain.Person";
return kk;
}
}
@Import(MyImport.class)
public class Configurate {
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
}
}
}
5.@ComponentScan注解和@componet,@Service,@Controller ,@Reposity的组合使用 @ComponentScan("com.yang.spring") public class Configurate { } @Component public class Person { private String name; private int age; } public class App { public static void main( String[] args ) { ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class); String[] definitionNames = ctx.getBeanDefinitionNames(); for (String definitionName : definitionNames) { System.out.println(definitionName); } } }
6.实现ImportBeanDefinitionRegistrar,需求:当容器中有person这个bean时才注册Pig这个bean
public class Person {
private String name;
private int age;
}
public class Pig {
public Pig() {
}
}
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
if(beanDefinitionRegistry.containsBeanDefinition("person")){
RootBeanDefinition bd = new RootBeanDefinition(Pig.class);
beanDefinitionRegistry.registerBeanDefinition("cutePig",bd);
}
}
}
@Import({MyImportBeanDefinitionRegister.class})
public class Configurate {
@Bean
public Person person(){
return new Person("yangxiaohui",22);
}
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
}
}
}
7.通过实现FactoryBean接口 public class Pig { public Pig() { } } public class MyFactoryBean implements FactoryBean<Pig> { @Override public Pig getObject() throws Exception { return new Pig(); } @Override public Class<?> getObjectType() { return Pig.class; } @Override public boolean isSingleton() { return true; } } @Import({MyFactoryBean.class}) public class Configurate { @Bean public Person person(){ return new Person("yangxiaohui",22); } } public class App { public static void main( String[] args ) { ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class); Object bean = ctx.getBean("com.yang.spring.domain.MyFactoryBean"); System.out.println(bean.getClass());//class com.yang.spring.domain.Pig } }
//8.手工注册 public class Cat { public Cat() { System.out.println("猫被初始化"); } } public class Demo { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(Appconfig.class); ctx.refresh(); RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class); ctx.registerBeanDefinition("cat",rootBeanDefinition); System.out.println(ctx.getBean("cat").getClass()); } }
@bean注解一般用于第三方类,如redis的key和value对应的序列化器的 @ComponentScan用于自身开发的类 @Import方式比较少用
@Condional注解的用法,如果需要根据不同系统,注入不同的bean
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String osVersion = environment.getProperty("os.name");
if(osVersion.contains("linux")){
return true;
}
return false;
}
}
public class WindowsCondition implements Condition{
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String osVersion = environment.getProperty("os.name");
if(osVersion.contains("Windows")){
return true;
}
return false;
}
}
public class Configurate {
@Bean
@Conditional(LinuxCondition.class)
public Person chinese(){
return new Person("xiaoMing",22);
}
@Bean
@Conditional(WindowsCondition.class)
public Person english(){
return new Person("peter",18);
}
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
}
}
}

浙公网安备 33010602011771号