环境搭建:
新建一个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. 集成学习小结(RF、adaboost、xgboost)

    目录 回顾监督学习的一些要素 集成学习(学什么) bagging boosting 梯度提升(怎么学) GBDT Xgboost 几种模型比较 Xgboost 与 GBDT xgboost 和 LR ...

  2. 力扣Leetcode 680. 验证回文字符串 Ⅱ

    验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca ...

  3. Python协程之asyncio

    asyncio 是 Python 中的异步IO库,用来编写并发协程,适用于IO阻塞且需要大量并发的场景,例如爬虫.文件读写. asyncio 在 Python3.4 被引入,经过几个版本的迭代,特性. ...

  4. Pulsar 联合 TiDB 推出大数据场景数据应用分析解决方案

    方案概述 大数据时代,各类应用对消息解决方案的要求不仅仅是数据的流动,而是要在持续增长的服务和应用中传输海量数据,进行智能的处理和分析,帮助业务做出更加精准的决策. Pulsar 与 TiDB 联合解 ...

  5. Google Code Jam 2020 Round1B Expogo

    题意 你初始位于\((0,0)\),然后你想要到\((x,y)\)去,第\(i\)步的步长是\(2^{i-1}\),要求用最少的步数走到\((x,y)\). 解题思路 首先可以推出,走\(i\)步可以 ...

  6. 《Offer一箩筐》求职之前你必须知道的 4 件事!!

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」. 如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! Hi~ 这里是 ...

  7. C# 压缩源文件(导出源文件word文件)

    说明 1 : 在webUI 公共类,存放 ZipHelper 类 说明  2 :判断文件路径是否存在,不存在则创建文件夹 说明 3  : 引用类方法,判断压缩文件,返回的,是true/false 引用 ...

  8. 跟着兄弟连系统学习Linux-【day04】

    day04-20200601 p15.链接文件 [ln -s 原文件   连接文件]软连接,所有人都可以操作软连接文件(实际上是取决于原文件的权限),类似于Windows的快捷方式,方便进行管理.软连 ...

  9. 超详细!盘点Python中字符串的常用操作

    在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...

  10. python 3 字符串

    字符串中单引号与双引号无差别 三单引号与三双引号 三引号允许一个字符串跨多行,字符串中可以包含换行符等特殊字符 字符串使用索引的方法来读取,正向从0开始计数,反向从-1开始计数 反向索引 字符串切片 ...