Spring复习03----bean的作用域------ bean的自动装配-------Spring 注解实现自动装配--------Spring注解实现组件注册------注解属性赋值

等同于

<context:component-scan base-package=“cn.fg”>

<context:include-filter type=“annotation” expression=“org.springframework.stereotype.Controller”/>

<context:exinclude-filter type=“annotation” expression=“org.springframework.stereotype.Service”/>

</context:component-scan>

自定义TypeFilter指定过滤规则

public class MyTypeFilter implements TypeFilter {

@Override

public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {

//获取当前类注解信息

AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();

//获取当前正在扫描的类的类信息

ClassMetadata classMetadata = metadataReader.getClassMetadata();

//获取当前类资源(类的路径)

Resource resource = metadataReader.getResource();

String className = classMetadata.getClassName();

System.out.println(“—” + className);

/*if (className.contains(“er”)){

return true;

}*/

return false;

}

}

@Scope(“prototype”) 多例的bean,默认是多实例的bean

@Conditional(LinuxCondition.class)

必须满足条件后,bean才会被创建,该注解也可以用在类上

package cn.fg.demo.condition;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;

import org.springframework.context.annotation.Condition;

import org.springframework.context.annotation.ConditionContext;

import org.springframework.core.env.Environment;

import org.springframework.core.type.AnnotatedTypeMetadata;

//判断是否linux系统

public class LinuxCondition implements Condition { //需要实现Condition接口

/**

  • ConditionContext:判断条件能使用的上下文(环境)

  • AnnotatedTypeMetadata:注释信息,可以获取到注解标注在所在类的或所在方法上的其他注解的信息,这里传进来的是StandardAnnotationMetadata,应用场景搜百度

*/

@Override

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

// TODO是否linux系统

//1、能获取到ioc使用的beanfactory

ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();

//2、获取类加载器

ClassLoader classLoader = context.getClassLoader();

//3、获取当前环境信息

Environment environment = context.getEnvironment();

//4、获取到bean定义的注册类

BeanDefinitionRegistry registry = context.getRegistry();

String property = environment.getProperty(“os.name”);

//可以判断容器中的bean注册情况,也可以给容器中注册bean

boolean definition = registry.containsBeanDefinition(“person”);

if(property.contains(“linux”)){

return true;

}

return false;

}

@Import给容器中快速导入组件

public class TestImport {

}

/**

  • 配置类,代替配置文件

*/

@Configuration //告诉Spring这是一个配置类

@Import(TestImport.class)

public class MainConfig {

@Bean(“person”)

public Person person(){

return new Person(“KKK”, 25);

}

}

ImportSelector: 返回需要导入的组件的全类名数组。springBoot常用

public class MyImportSelector implements ImportSelector {

@Override

public String[] selectImports(AnnotationMetadata annotationMetadata) {

return new String[]{“com.bjtu.bean.Blue”,“com.bjtu.bean.Red”};

}

}

@Import({TestImport.class, MyImportSelector.class})

public class MainConfig {

@Bean(“person”)

public Person person(){

return new Person(“KKK”, 25);

}

}

在这里插入图片描述

ImportBeanDefinitionRegistrar:手动注册bean到容器中

//创建一个spring定义的FactoryBean

public class ColorFactoryBean implements FactoryBean {

//返回一个Color对象,这个对象会添加到容器中

@Override

public Color getObject() throws Exception {

System.out.println(“ColorFactoryBean…getObject…”);

return new Color();

}

@Override

public Class<?> getObjectType() {

return Color.class;

}

//是单例?

//true,这个bean是个单实例,在容器中保存一份

//false,多实例,每次获取都会创建一个新实例

@Override

public boolean isSingleton() {

return false;

}

}

@Test

public void ImportTest(){

//工厂Bean获取的是调用getObject创建的对象

//多实例的Bean每创建一次对象就调用一次getObject()方法

Object bean1 = applicationContext.getBean(“colorFactoryBean”);

Object bean2 = applicationContext.getBean(“colorFactoryBean”);

System.out.println(“bean1的类型是:”+bean1.getClass());

System.out.println(bean1 == bean2);

System.out.println(“***********************”);

//加上“&”获取的就是获取工厂本身

Object bean3 = applicationContext.getBean(“&colorFactoryBean”);

System.out.println(bean3);

}

Spring 注解 属性赋值

@Value赋值

1). 基本数值

2). 可以使用SpEL:#{}

3). 可以写${},取出配置文件【properties】中的值(在运行环境变量里面的值)

注:对于idea来说,它的路径resourse默认到文件,所以只需要文件名就只可以获取到里面的值

public class Person {

//1.基本数值

@Value(“张三”)

private String name;

//2.SpEL:#{}

@Value(“#{18-2}”)

private Integer age;

//取出配置文件properties中的值

@Value(“${person.nickName}”)

private String nickName;

public String getNickName() {

return nickName;

}

public void setNickName(String nickName) {

this.nickName = nickName;

}

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 +

“, nickName='” + nickName + ‘’’ +

‘}’;

}

public Person(String name, Integer age) {

this.name = name;

this.age = age;

}

public Person() {

}

}

//使用@PropertySource读取外部配置文件中的k/v保存到运行的环境变量中

// 加载完外部的配置文件以后使用${}取出配置文件的值

@PropertySource(value = {“person.properties”})

@Configuration //声明配置类

public class MainConfigOfProperty {

@Bean//注册一个组件

public Person person(){

return new Person();

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

笔者已经把面试题和答案整理成了面试专题文档

image

image

image

image

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
s://img-community.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

笔者已经把面试题和答案整理成了面试专题文档

[外链图片转存中…(img-1ANHpPCH-1712689482752)]

[外链图片转存中…(img-yasqoN4Y-1712689482752)]

[外链图片转存中…(img-PO6FEd16-1712689482752)]

[外链图片转存中…(img-h7JOnG3y-1712689482753)]

[外链图片转存中…(img-CFVwOZMe-1712689482753)]

[外链图片转存中…(img-QWdo4VRL-1712689482753)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 30
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值