等同于
<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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/aa41e1e52dee1c810004bba2de1066fd.jpeg)
最后
笔者已经把面试题和答案整理成了面试专题文档
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
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)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!