1、包扫描+组件标注注解


使用到的注解如下,主要针对自己写的类

  • @Controller
  • @Service
  • @Repository
  • @Component
  • @ComponentScan

参考 spring注解开发:ComponentScan组件扫描

2、使用bean注解


主要使用场景:导入第三方包里面的组件,使用到的注解:

  • @Bean
参考:spring注解开发:Configuration&Bean

3、使用@Import注解


  • 使用方式:@Import(要导入到容器中的组件);容器中就会自动注册这个组件

  • bean的id默认是全类名
  • 示例:@Import(value = {Person.class})

实战

1、新建一个maven工程,添加如下依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>

2、新建一个实体 Person

package com.yefengyu.annotation.bean;

public class Person
{
private String name; private Integer age; public Person()
{
} public Person(String name, Integer age)
{
this.name = name;
this.age = age;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public Integer getAge()
{
return age;
} public void setAge(Integer age)
{
this.age = age;
} @Override
public String toString()
{
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

3、新建一个配置类(重点

package com.yefengyu.annotation.config;

import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*; @Configuration
@Import(Person.class)
public class MainConfig
{
}

4、测试代码

public static void main(String[] args)
{
ApplicationContext ctx= new AnnotationConfigApplicationContext(MainConfig.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names)
{
System.out.println(name);
}
Person person1= (Person)ctx.getBean(Person.class);
//bean的id默认是全类名
Person person2= (Person)ctx.getBean("com.yefengyu.annotation.bean.Person");
}

4、使用ImportSelector


ImportSelector和Import一起使用:首先编写一个类实现ImportSelector接口MyImportSelector,然后将MyImportSelector添加到Import中,那么MyImportSelector自定义逻辑返回需要导入的组件就会被加入到容器中。

利用上面第三节的代码,我们重新添加一个类,这个类什么都没有,现在我们尝试着使用ImportSelector方式将其注册到容器中。

package com.yefengyu.annotation.bean;

public class Car
{
}

1、编写MyImportSelector实现ImportSelector接口,重写selectImports方法,返回的数组中每个字符串就是要导入到容器的组件的全类名。

package com.yefengyu.annotation;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata; //自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector
{
//返回值就是要导入到容器的组件的全类名
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata)
{
return new String[]{"com.yefengyu.annotation.bean.Car"};
}
}

2、修改MainConfig配置类,使用Import注解加入MyImportSelector类,注意下面红色部分。

package com.yefengyu.annotation.config;

import com.yefengyu.annotation.MyImportSelector;
import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*; @Configuration
@Import({Person.class, MyImportSelector.class})
public class MainConfig
{
}

3、测试,同样使用上面的测试代码,可以看出打印结果为:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
com.yefengyu.annotation.bean.Person
com.yefengyu.annotation.bean.Car

4、针对于public String[] selectImports(AnnotationMetadata annotationMetadata)方法中的参数AnnotationMetadata有很多信息可以帮助筛选要注册的组件。

5、使用ImportBeanDefinitionRegistrar


和使用ImportSelector方式一样,定义一个类实现ImportBeanDefinitionRegistrar接口,重写其中的方法,手动注册组件。

1、定一个类,作为要注册的组件

package com.yefengyu.annotation.bean;

public class Alarm
{
}

2、实现ImportBeanDefinitionRegistrar接口,手动注册组件

package com.yefengyu.annotation;

import com.yefengyu.annotation.bean.Alarm;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata; public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar
{
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata,
BeanDefinitionRegistry beanDefinitionRegistry)
{
beanDefinitionRegistry.registerBeanDefinition("alarm",new RootBeanDefinition(Alarm.class));
}
}

beanDefinitionRegistry.registerBeanDefinition("alarm",new RootBeanDefinition(Alarm.class));

第一个参数是组件名称。

第二个参数是要注册的组件的类型的定义。

AnnotationMetadata 和上一节类似。BeanDefinitionRegistry 的功能很多:

3、修改MainConfig配置类,使用Import注解加入MyImportBeanDefinitionRegistrar类,注意下面红色部分。

package com.yefengyu.annotation.config;

import com.yefengyu.annotation.MyImportBeanDefinitionRegistrar;
import com.yefengyu.annotation.MyImportSelector;
import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*; @Configuration
@Import({Person.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig
{
}

4、测试,同样使用上面的测试代码,可以看出打印结果为:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
com.yefengyu.annotation.bean.Person
com.yefengyu.annotation.bean.Car
alarm

6、使用FactoryBean


1、首先创建一个待加入到容器的组件

package com.yefengyu.annotation.bean;

public class Event
{
}

2、创建一个Spring定义的FactoryBean

package com.yefengyu.annotation;

import com.yefengyu.annotation.bean.Event;
import org.springframework.beans.factory.FactoryBean; //创建一个Spring定义的FactoryBean
public class EventFactoryBean implements FactoryBean<Event>
{
//返回一个Event对象,这个对象会添加到容器中
@Override
public Event getObject()
throws Exception
{
return new Event();
} @Override
public Class<?> getObjectType()
{
return Event.class;
} //是单例?
//true:这个bean是单实例,在容器中保存一份
//false:多实例,每次获取都会创建一个新的bean;
@Override
public boolean isSingleton()
{
return true;
}
}

3、修改配置类,注意下面bean注解下面的代码

package com.yefengyu.annotation.config;

import com.yefengyu.annotation.EventFactoryBean;
import com.yefengyu.annotation.MyImportBeanDefinitionRegistrar;
import com.yefengyu.annotation.MyImportSelector;
import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*; @Configuration
@Import({Person.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig
{
@Bean
public EventFactoryBean eventFactoryBean()
{
return new EventFactoryBean();
}
}

4、修改测试代码如下:

package com.yefengyu.annotation;

import com.yefengyu.annotation.bean.Person;
import com.yefengyu.annotation.config.MainConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main
{
public static void main(String[] args)
{
ApplicationContext ctx= new AnnotationConfigApplicationContext(MainConfig.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names)
{
System.out.println(name);
}
//测试EventFactoryBean
Object eventFactoryBean = ctx.getBean("eventFactoryBean");
System.out.println("bean 的类型为:" + eventFactoryBean.getClass()); Object factoryBean = ctx.getBean("&eventFactoryBean");
System.out.println("bean 的类型为:" + factoryBean.getClass());
}
}

5、结果如下:

mainConfig
com.yefengyu.annotation.bean.Person
com.yefengyu.annotation.bean.Car
eventFactoryBean
alarm
bean 的类型为:class com.yefengyu.annotation.bean.Event
bean 的类型为:class com.yefengyu.annotation.EventFactoryBean

总结:

  • 默认获取到的是工厂bean调用getObject创建的对象

ctx.getBean("eventFactoryBean");

  • 要获取工厂Bean本身,我们需要给id前面加一个&

ctx.getBean("&eventFactoryBean");

spring注解开发:容器中注册组件方式的更多相关文章

  1. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...

  2. Spring注解驱动开发04(给容器中注册组件的方式)

    给容器中注册组件的方式 1. 组件注解标注 + 包扫描(适用于自己写的类) //控制层组件 @Controller public class PersonController { } //业务逻辑层组 ...

  3. 2、组件注册-@Configuration&@Bean给容器中注册组件

    2.组件注册-@Configuration&@Bean给容器中注册组件 2.1 创建maven项目 spring-annotation pom.xml文件添加 spring-context 依 ...

  4. 【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件

    写在前面 在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对! ...

  5. spring 给容器中注册组件的几种方式

    1.@Bean 导入第三方的类或包的组件 2.包扫描+组件的标注注解(@ComponentScan: @Controller,@service,@Reponsitory,@Componet), 自己写 ...

  6. 向Spring容器中注册组件的方法汇总小结

    1.通过xml定义 <bean class=""> <property name="" value=""></ ...

  7. 一、Spring之组件注册-@Configuration&@Bean给容器中注册组件

    xml配置方式 首先我们创建一个实体类Person public class Person { private String name; private Integer age; private St ...

  8. spring注解开发-容器创建全过程(源码)

    1.Spring容器的创建会经历refresh()方法[创建刷新](以AnnotationConfigApplicationContext为例) public AnnotationConfigAppl ...

  9. Spring注解开发_Spring容器创建概述

    浅尝Spring注解开发_Spring容器创建概述 浅尝Spring注解开发,基于Spring 4.3.12 概述Spring容器创建的过程,包括12个方法的执行 浅尝Spring注解开发_自定义注册 ...

随机推荐

  1. Page.IsPostBack

    ASP.NET页面的执行顺序说明:Page_Init(页面初始化引发的事件)——Page_Load(加载页面时引发的事件)——ControlEvent(服务器控件引发的事件)——Page_UnLoad ...

  2. ApacheHttpServer出现启动报错:the requested operation has failed解决办法

    转自:https://www.jb51.net/article/21004.htm 原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装 ...

  3. 在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问

    在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问 问题描述:在Intellij上开发项目发布到tomcat时,同一个局域网 ...

  4. Linux设置数据库自动备份

    本文为转载,最末端为原地址 以CentOS 7.6系统与Oracle 11g为例: 一.先找到数据库的环境变量 如果是在root账户下,须先登录到数据库所在账户 su oraclecat ~/.bas ...

  5. 微信小程序(11)--购物车

    今天记录一下购物车案例,实现购物车的全选,单选,数量加一减一,金额总数,以及清空购物车. <view class="main"> <!-- hasList 列表是 ...

  6. Django——Ajax相关

    Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数 ...

  7. Sass:RGB颜色函数-Red()、Green()、Blue()函数

    Red() 函数 red() 函数非常简单,其主要用来获取一个颜色当中的红色值.假设有一个 #f36 的颜色,如果你想得到 #f36 中的 red 值是多少,这个时候使用 red() 函数就能很简单获 ...

  8. ltp-ddt smp_cpu_affinity

    # @name SMP CPU Affinity# @desc Check that processes assigned to multiple CPUs complete without erro ...

  9. 最新Zip压缩文件漏洞,黑客可以触发目录遍历攻击

    近日,国内某安全公司研究人员透露了一个关键漏洞的详细信息,该漏洞影响了许多生态系统中的数千个项目,黑客可以利用这些漏洞在目标系统上实现代码执行. 黑客是如何通过Zip压缩文件入侵攻击?被称为“ZipS ...

  10. wxpython 文本框TextCtrl

    path_text = wx.TextCtrl(frame, pos=(5, 5), size=(350, 24))最常用的两个函数:path = path_text.GetValue() conte ...