一、@Configuration注解用来提供创建Bean的环境,@Bean写在方法上用于创建bean:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>springDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency></dependencies></project>

1.

package com.zyq.studemo;import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.beans.ConstructorProperties;@Data
//@AllArgsConstructor
@NoArgsConstructor
@Component
@Lazy(true) //true为默认值
@Scope("singleton")//单实例 IOC容器启动的时候就会调用方法创建对象,以后每次获取
//都是从容器当中拿同一个对象(map当中)。//单例模式要慎用:因为单例的对象会从创建
//到程序运行结束一直存在,多例对象会被垃圾回收期回收@Scope("prototype")//多实例,
//IOC容器启动创建的时候,并不会创建对象放在容器在容器当中,每次当你需要的时候,需
//要从容器当中取该对象的时候,就会创建。
//@Scope("request")//同一个请求创建一个实例(一个request对应一个Student对象)
//@Scope("session")//同一个session创建一个实例(一个session对应一个Student对象)
public class Student {@Value("zs")private String name;private int age;public String toString(){return name;}@ConstructorProperties({"张三","20"})//构造函数上的注释,显示该构造函数的//参数如何对应于构造对象的 getter 方法。例如:public Student(String name, int age) {this.name = name;this.age = age;}@PostConstruct//属于Spring JSR-250 属于jdk中的注释//在构造方法之前执行post//表示之前的肆意表示public void postConstruct(){System.out.println("Student对象初始化后执行PostConstruct");}@PreDestroy//属于JSR-250 属于jdk中的注释//表示在bean对象销毁之前执行,当调用容器的close//方法时会执行此方法,不调用不会执行。//如果还有bean对象被其他地方引用,则可能会导致内存泄漏,所以要正确的执行容器的close方法public void preDestroy(){System.out.println("Student对象销毁前执行preDestroy");}}

2.

package com.zyq.studemo;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration//让当前stuConfig成为配置类(可用于newjava对象)
public class StuConfig {@Bean//用在new java对象的方法上边,方法名称作为 bean 的 ID,public Student getStudent(){return new Student();}
}
//@Bean注解小括号中,可以用initMethod=""指定初始化对象后要执行的方法,可以用
//destroyMethod指定销毁之前要执行的方法

3.

package com.zyq.studemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class StuTestCase {public static void main(String[] args) {ApplicationContext ctx =//可以用 AnnotationConfigApplicationContext 来加载配置类,并且不需要spring的配置文件new AnnotationConfigApplicationContext(StuConfig.class);Student stu = ctx.getBean(Student.class);System.out.println(stu);}
}//AnnotationConfigApplicationContext加载多个配置类的案例
//public static void main(String[] args) {
//    AnnotationConfigApplicationContext ctx =
//            new AnnotationConfigApplicationContext();
//    ctx.register(AppConfig.class, OtherConfig.class);
//    ctx.register(AdditionalConfig.class);
//    ctx.refresh();
//    MyService myService = ctx.getBean(MyService.class);
//    myService.doStuff();
//}

二、在Config中用构造方法给一个bean中注入另一个bean:

1.

package com.zyq.computerDemo;import lombok.Data;@Data
public class KeyBoard {private String model;}

2.

package com.zyq.computerDemo;import lombok.Data;@Data
public class Computer {private KeyBoard kb;public Computer(KeyBoard kb) {this.kb = kb;}public void init(){System.out.println("初始化Computer的方法");}public void  cleanup(){System.out.println("销毁Computer的方法");}
}

3.

package com.zyq.computerDemo;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class ComputerConfig {//Scope("prototype")指定Computer对象的创建方式是原型模式。@Scope("prototype")//initMethod, destroyMethod指定Computer的初始化和销毁方法@Bean(initMethod = "init", destroyMethod = "cleanup" )public Computer getComputer(){//在Computer中需要用构造器注入一个键盘对象,则调用getKeyBoard()方法就行KeyBoard kb=getKeyBoard();kb.setModel("雷蛇黑寡妇");return new Computer(kb);}@Beanpublic KeyBoard getKeyBoard(){return new KeyBoard();}
}

4.

package com.zyq.computerDemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ComTestCase {public static void main(String[] args) {//可以用 AnnotationConfigApplicationContext 来加载配置类,//并且不需要spring的xml配置文件ApplicationContext ctx =new AnnotationConfigApplicationContext(ComputerConfig.class);Computer c = ctx.getBean(Computer.class);KeyBoard kb=c.getKb();System.out.println("键盘型号:"+kb.getModel());}
}

三、在一个Config配置类中引入另一个Config配置类:

1.

package com.zyq.importDemo;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class XiAnConfig {@Beanpublic BigGoosePagoda getBigGoosePagoda(){return new BigGoosePagoda();}
}@Data
class  BigGoosePagoda{//大雁塔@Value("陕西省西安市雁塔区大慈恩寺")private String location;
}

2.

package com.zyq.importDemo;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@Import(XiAnConfig.class)
//表示引入另一个配置类,相当于ShanXiShengConfig中包含了XiAnConfig中的内容
public class ShanXiShengConfig {@Beanpublic HukouWaterfalls getWaterFalls(){return new HukouWaterfalls();}
}class HukouWaterfalls {//壶口瀑布
}

3.

package com.zyq.importDemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ImportTestCase {public static void main(String[] args) {ApplicationContext ctx =//可以用 AnnotationConfigApplicationContext 来加载配置类,并且不需要spring的xml配置文件new AnnotationConfigApplicationContext(ShanXiShengConfig.class);//因为ShanXiShengConfig用@Import(XiAnConfig.class)引入了XiAnConfig,// 相当于ShanXiShengConfig中包含了XiAnConfig中的内容//所以加载spring容器时只需要加载一个配置类ShanXiShengConfig就可以BigGoosePagoda bgp = ctx.getBean(BigGoosePagoda.class);System.out.println("大雁塔位置:"+bgp.getLocation());}
}

注意: 可以用Configuration类标注@Configuration当做配置类,并标注@ComponentScan注解配置扫描的包, 并标注@PropertySource("classpath:properties文件")用来配置读取properties文件内容。 这样给XXXProperty类中的属性赋值。  尤其在连接数据库的JdbcProperty类中使用。

另外spring还会读取电脑操作系统中的一些环境信息和jdk运行环境信息,所以要properties文件内容中的key要避免和其他key重复(比如username,只有在windows才会有这样的问题)。(spring会优先获取系统中的信息值)(当连接数据库时 连接参数采用了操作系统的值的话会一直连接不上)

@Configuration和@Bean注解相关推荐

  1. Spring @Configuration 和 @Bean 注解

    @Configuration 和 @Bean 注解 带有 @Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源.@Bean 注解告诉 Spri ...

  2. @Configuration和@Bean注解详解

    本文来详细说下@Configuration和@Bean注解 文章目录 @Configuration注解 @Bean注解 @Configuration注解 @Configuration注解源码 pack ...

  3. Spring学习笔记——@Configuration和@Bean注解

    前言 在Spring框架中,有两种对容器的配置和启动方式,一种是基于XML文档的配置方式,一种则是"零配置",即Java Based Configuration. 而在零配置中,最 ...

  4. SpringBoot配置@PropertySource、@ImportResource、@Bean注解

    引言 @ConfigurationProperties 与@Bean结合为属性赋值 与@PropertySource(只能用properties文件)结合读取指定文件 @Validation 支持使用 ...

  5. SpringBoot学习之@Configuration注解和@Bean注解

    @Configuration 1.@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用. 2.@Configurat ...

  6. 【Spring注解系列01】@Configuration与@Bean

    1. @Configuration与@Bean @Configuration: 告诉Spring这是一个配置类,配置类==配置文件. @Configuration==beans.xml @Bean: ...

  7. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...

  8. 【Spring 高级注解】@Configuration、@Bean、@ComponentScan

    Spring 高级注解(3.x以上) @Configuration:配置 Bean 基于注解开发使用日志 logback @Bean 注解 @Bean 注解的基本使用 @Bean 注解的注入与细节 @ ...

  9. @Bean的方法中如何注入同一个@Configuration注解的类里的其他@Bean注解的bean

    在看别人代码的时候,发现一个问题,简单了个例子 @Configurationpublic class MyConfig{@Beanpublic Test1 test1() {return new Te ...

最新文章

  1. CAS(compareAndSwap)原理
  2. Dynamips/Dynagen模拟CISCO路由环境
  3. 1.eclipse怎么样新建web项目,eclipse新建web项目
  4. 我的4条产品设计工作观
  5. DropdownList 赋初始值问题
  6. JavaScript 语言基础知识点图示
  7. java 反射 获取成员_java 反射获取成员
  8. python 制定识别图片的某些区域_python批量识别图片指定区域文字内容
  9. json 转换 java odl_JSON与JAVA数据的转换
  10. java 日期 yyyy_java日期中YYYY与yyyy的区别
  11. 2021王道考研pdf
  12. SPSS教程:单因素重复测量方差分析,超详细图文教程
  13. ios+测试版软件,ios15测试版描述文件
  14. 冗余链路引起广播风暴和MAC地址表不稳定
  15. thinkphp5项目--个人博客(五)
  16. matlab 中括号里面有分号是什么意思
  17. photoshop cs6 安装(附安装包)
  18. WebGL场景的两种地面构造方法
  19. 义乌中学集训(没打的题慢慢补)
  20. ubuntu 中比较好用的一些工具

热门文章

  1. DELL笔记本、台式机驱动的安装顺序
  2. 使用ajax向后台传递数组,traditional必须要设置为true
  3. maven 400 Repository does not allow updating assets
  4. python基础语法(缩进规则)
  5. Kafka(一):基础
  6. 【图像检测-缺陷检测】基于形态学实现瓶盖瑕疵检测matlab代码
  7. 中医分型辨治耳鸣合集
  8. oppovivo会用鸿蒙系统么,鸿蒙系统风头无两,小米、OPPO、vivo会采用吗?
  9. 复数乘积的共轭等于它们各自共轭的乘积
  10. linux下命令行浏览器w3m,Linux 终端浏览器 w3m