环境搭建:
新建一个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);
} }
}

  



  

 

spring给容器注册组件 的几种方式的更多相关文章

  1. Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!

    ​ 前一篇<不要再说不会Spring了!Spring第一天,学会进大厂!>文章可点击下方链接进行回看. 不要再说不会Spring了!Spring第一天,学会进大厂! 今天将继续讲解Spri ...

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

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

  3. Vue加载组件、动态加载组件的几种方式

    https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...

  4. 使用react定义组件的两种方式

    react组件的两种方式:函数定义,类定义 在定义一个组件之前,首先要明白一点:react元素(jsx)是react组件的最基本的组成单位 组件要求: 1,为了和react元素进行区分,组件名字首必须 ...

  5. Spring Boot定义系统启动任务的两种方式

    Spring Boot定义系统启动任务的两种方式 概述 如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web ...

  6. JDBC注册驱动的三种方式

    JDBC注册驱动的三种方式 1.通过导入的JDBC的驱动包拿到的com.mysql.jdbc.Driver对象,利用java.sql.DriverManager对象的DriverManager.reg ...

  7. spring mvc获取路径参数的几种方式 - 浅夏的个人空间 - 开源中国社区

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  8. react学习笔记1之声明组件的两种方式

    //定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class ...

  9. Spring加载properties文件的两种方式

    在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可, ...

随机推荐

  1. 【Flutter 实战】动画序列、共享动画、路由动画

    老孟导读:此篇文章是 Flutter 动画系列文章第四篇,本文介绍动画序列.共享动画.路由动画. 动画序列 Flutter中组合动画使用Interval,Interval继承自Curve,用法如下: ...

  2. 面试官:谈一下你对DDD的理解?我:马什么梅?

    领域模型(domain model)是对领域内的概念类或现实世界中对象的可视化表示.领域模型也称为概念模型.领域对象模型和分析对象模型. ——<UML和模式应用> 我们在日常开发中,经常针 ...

  3. Angular 之我见

    很久没有写过技术软文了,虽然 Angular 发布已有四年,得到了越来越多人的关注,但是仍然有很多人不分青红皂白的进行诋毁.我打算结合自己的经历从客观的角度说聊一聊我眼中的 Angular. 本人刚做 ...

  4. 服务发现Eureka、zookeeper、consul

    Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态). ...

  5. 2020.08.31 Unit 10(暂未完成)

    [重点短语] 01.at night 在晚上 02.in a more natural environment 在一个更加自然的环境中 03.all year round 一年到头,终年 04.be ...

  6. 获取android手机的屏幕分辨率 android开发

    /** * 获取屏幕分辨率 */ private void getResolution() { // TODO Auto-generated method stub Display display = ...

  7. .NET5.0 单文件发布打包操作深度剖析

    .NET5.0 单文件发布打包操作深度剖析 前言 随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索:这其中就包含了"单文件发布"这个炫酷的功能,实 ...

  8. I - 乓 (BFS+邻接表)

    USTC campus network is a huge network. There is a bi-directional link between every pair of computer ...

  9. 小程序mpvue中flyio的使用方法

    Fly.js 一个基于Promise的.强大的.支持多种JavaScript运行时的http请求库. 有了它,您可以使用一份http请求代码在浏览器.微信小程序.Weex.Node.React Nat ...

  10. 交换机&&路由器

    交换机 交换机就是一种信号转发设备,它帮助两个网络节点进行信号的传输 路由器 路由器路由器,要了解什么是路由器,首先我们要先明白何为'路由'? 路由:是指把数据从一个地方传送到另一个地方的行为和动作 ...