Spring Framework 源码学习笔记,字节跳动Android实习面试凉凉经

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

public Person stark(){

Person person = new Person();

person.setName(“Stark”);

person.setAge(40);

return person;

}

再次运行SingleBeanContainerTest的mian方法,控制台报错No bean named ‘person’ available

image.png

这是因为代码中获取的bean的id为person,而配置了中@Bean注解下的方法名也就是bean的id为stark,所以出现报错,更改getBean(“person”)为getBean(“stark”),再次执行,获取成功

image.png

除了修改@Bean注解下的方法名来定义Bean的id,也可以通过@Bean(“thor”)的方式来定义Bean的名称

image.png

IoC容器的数据结果为Map,注册Bean是就是往Map里面添加数据,使用put(“key”,value),key为Bean的id,value就是对象,

Section 03 - XML与注解批量注册Bean


@CompponmentScan 代替@Bean 分别新增controller,service,dao三个package,并增加响应的类,通过@Controller,@Service,@Repository三个注解将三个类声明为Bean

@Controller

public class PersonController {

}

@Service

public class PersonService {

}

@Repository

public class PersonDao {

}

修改BeanConfig,增加@ComponentScan注解,将com.citi包下面的所有Bean都扫描到BeanConfig这个配置类中,就相当于XML配置文件中有许多bean标签,好处是不用一个个写bean标签,通过一个注解可以扫描所有的Bean

@Configuration

@ComponentScan(basePackages = “com.citi”)

public class BeanConfig {

}

测试IoC容器是否实例化扫描到的Bean,新增一个ComponentScanTest测试类

public class ComponentScanTest {

@Test

public void getBeansByScan(){

ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);

String[] beanDefinitionNames = context.getBeanDefinitionNames();

for (String beanDefinitionName : beanDefinitionNames) {

System.out.println(beanDefinitionName);

}

}

}

控制台输出如下,自定义的三个类,包括BeanConfi本身都被容器实例化

image.png

entity包中的Person类没有被实例化,是因为Person类上没有添加注解,也即是没有配置bean标签,所以没有注册到容器中,也就没有被实例化,给Person实体类添加一个@Component注解,标识为一个Bean,再次执行测试方法,控制台打印结果如下,Person类被实例化

image.png

@ComponentScan源码

image.png

includeFilters()的使用

image.png

includeFilters()和excludeFilters()返回都是一个Filter数组

FilterType是一个枚举类,默认是ANNOTATION,注解方式

image.png

修改BeanConfig代码,增加includeFilters(),只扫描com.citi包下面的@Controller,@Service注解标识的Bean,一定不要忘记useDefaultFilters = false

@Configuration

@ComponentScan(basePackages = “com.citi”,

includeFilters = {

@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.class})

},

useDefaultFilters = false)

public class BeanConfig {

}

执行测试,控制台输出只包含了@Controller,@Service注解的Bean,@Componet和@Repository注解标识的类并没有被容器管理

image.png

Plus:为什么使用includeFilters时,要配置useDefaultFilters = false?

image.png

当useDefaultFilters = true时,进入到registerDefaultFilters()方法中

image.png

该方法中将@Component注解的Bean都加入到includeFilters中,而@Controller,@Service,@Repository都是基于@Component的注解,所有useDefaultFilters = true会导致设置是扫描@Controller和@Service注解的Bean不生效

使用excludeFilters(),将BeanConfig中includeFilters改为excludeFilters(),并且useDefaultFilters = true,执行测试,可以看出只包含了除了@Controller,@Service标注的Bean之外的其他Bean的实例化对象

image.png

使用FilterType枚举类中的ASSIGNABLE_TYPE进行过滤Bean,修改BeanConfig为如下,表示触PersonController和PersonService之外的其他Bean

@Configuration

@ComponentScan(basePackages = “com.citi”,

excludeFilters = {

@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {PersonController.class, PersonService.class})

},

useDefaultFilters = true)

public class BeanConfig {

}

image.png

使用自定义的FilterType,在config包下新增CustTypeFilter,继承TypeFilter

public class CustTypeFilter implements TypeFilter {

/**

  • @param metadataReader 读取到当前正在扫描的类的信息

  • @param metadataReaderFactory 可以获取到其他任何类的信息

  • @return

  • @throws IOException

*/

@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);

// 过滤条件,return true表示过滤掉符合这个条件的Bean

if (className.contains(“service”)){

return true;

}

return false;

}

}

image.png

除了@ComponentScan之外还可以添加@ComponentScans,也就是多个@ComponentScan

image.png

使用了两个@ComponentScan注解,一个是去除自定义的Bean,即bean id包含“service”字符串的Bean,另外一个使用Annotation 类型的Filter,去除@Controller注解标记的Bean

@ComponentScans({@ComponentScan(basePackages = “com.citi”,

excludeFilters = {

@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {CustTypeFilter.class})

},

useDefaultFilters = true),

@ComponentScan(basePackages = “com.citi”,

excludeFilters = {

@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})

},

useDefaultFilters = true)})

public class BeanConfig {

}

这里控制台应该输出包含除了PeresonController和PersonService外的实例化对象,根据控制台打印可以看出配置的两个@ComponentScan都没有生效,这里还有待继续探索,

image.png

Section 04 - Bean的单实例和多实例


IoC容器不管是使用注解还是xml方式,默认都是单实例的,IoC容器初始化的时候就会被创建,多实例仅当bean被使用的时候才会创建 修改BeanConfi为

@Configuration

public class BeanConfig {

@Bean

public Person person(){

Person person = new Person();

person.setName(“Stark”);

person.setAge(40);

return person;

}

}

新增测试类SingleOrMultInstanceTest,执行testSingleBean()方法

public class SingleOrMultiInstanceTest {

@Test

public void testSingleBean(){

ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);

Person person = (Person) context.getBean(“person”);

Person person1 = (Person) context.getBean(“person”);

System.out.println(“是否为单实例:” + (person == person1));

}

}

查看输出结果,通过比较从容器中获取的两个bean是否为一个bean,默认是单实例

image.png

@Scope注解可以配置Bean为单实例或者多实例 @Scope源码

image.png

image.png

修改BeanConfig

@Configuration

public class BeanConfig {

@Bean

@Scope(“prototype”)

public Person person(){

Person person = new Person();

person.setName(“Stark”);

person.setAge(40);

return person;

资源分享

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

链图片转存中…(img-xOZWjd9i-1713571691744)]

[外链图片转存中…(img-0hGyHfFE-1713571691744)]

[外链图片转存中…(img-ty6rbnlE-1713571691744)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-B8ELC6lU-1713571691745)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值