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);
}
}
}
spring给容器注册组件 的几种方式的更多相关文章
- Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
前一篇<不要再说不会Spring了!Spring第一天,学会进大厂!>文章可点击下方链接进行回看. 不要再说不会Spring了!Spring第一天,学会进大厂! 今天将继续讲解Spri ...
- spring 给容器中注册组件的几种方式
1.@Bean 导入第三方的类或包的组件 2.包扫描+组件的标注注解(@ComponentScan: @Controller,@service,@Reponsitory,@Componet), 自己写 ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
- 使用react定义组件的两种方式
react组件的两种方式:函数定义,类定义 在定义一个组件之前,首先要明白一点:react元素(jsx)是react组件的最基本的组成单位 组件要求: 1,为了和react元素进行区分,组件名字首必须 ...
- Spring Boot定义系统启动任务的两种方式
Spring Boot定义系统启动任务的两种方式 概述 如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web ...
- JDBC注册驱动的三种方式
JDBC注册驱动的三种方式 1.通过导入的JDBC的驱动包拿到的com.mysql.jdbc.Driver对象,利用java.sql.DriverManager对象的DriverManager.reg ...
- spring mvc获取路径参数的几种方式 - 浅夏的个人空间 - 开源中国社区
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- react学习笔记1之声明组件的两种方式
//定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class ...
- Spring加载properties文件的两种方式
在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可, ...
随机推荐
- SpringBoot使用简单缓存
第一步开启缓存(只要是springboot项目就可以) 数据库连接等相关配置请读者自行实现. 在Application启动类上添加注解 @EnableCaching 开启缓存 @SpringBoot ...
- influxDB初步学习
influxdb的安装等操作在我的文章. 首先得装influxdb,其次操作如下. application.properties spring.datasource.test1.jdbc-url=jd ...
- 记一个Selenium自动化测试网页
今天想跟大家分享的是Selenium自动化测试网页,就是关于selenium的自动化测试一些基础的东西,如有不对的地方请多多指教. 一.安装环境 1.Python环境 安装完成后通过Windows命令 ...
- 用 Java 拿下 HTML 分分钟写个小爬虫
本文适合有 Java 基础知识的人群 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开源 Java 版一款网页元素解析框架- ...
- 利用Decorator和SourceMap优化JavaScript错误堆栈
配合源码阅读体验更佳. 最近收到用户吐槽 @cloudbase/js-sdk(云开发Cloudbase的JavaScript SDK)的报错信息不够清晰,比如下面这条报错: 这属于业务型报错,对于熟悉 ...
- Python3网络爬虫之requests动态爬虫:拉钩网
操作环境: Windows10.Python3.6.Pycharm.谷歌浏览器目标网址: https://www.lagou.com/jobs/list_Python/p-city_0?px=defa ...
- 用rspec执行自动化测试用例
rspec是一款行为驱动开发(BDD)的工具,不过在这里用于测试,准确来说应该是测试驱动开发(TDD)吧.事实上我也没搞清楚.作为初学者不清楚就不清楚吧,以后会知道的.写博客无非就是写写学习笔记,不纠 ...
- java控制流程(一)
一.scanner: scanner可以获取用户的输入的信息 scanner的初始化: //导入的包 import java.util.Scanner; public class Test { pub ...
- webpack使用优化(基本篇
为什么要使用Webpack 与react一类模块化开发的框架搭配着用比较好. 属于配置型的构建工具,比较用容易上手,160行代码可大致实现gulp400行才能实现的功能. webpack使用内存来对构 ...
- 微服务架构组件梳理之Netflix停更之后该何去何从
自2018年底,Netflix陆续宣布Eureka.Hystrix等框架进入维护状态,不再进行新功能的开发. 恰逢最近我打算对公司的办公项目进行微服务架构升级,所以恶补了一番微服务相关知识,在这里进行 ...