没有合适的资源?快使用搜索试试~ 我知道了~
每日十道面试题(七) 每天看一看小知识增加一下 1. 谈一谈Springboot的启动类注解 @springbootApplication其实是一个复合注解,它其实里面由==@SpringbootConfiguration+@EnableAutoConfiguration+@ComponentScan==三大打手,第一个其实就是标明主启动类是一个配置类,因为点进去你会发现它就是一个@Configuration的注解,这里先要声明了解一个javaConfig配置的形式@Configuration+@Bean可以配置到ioc容器中 然后我们接下来重点说剩下两个,@ComponentScan的功能是
资源推荐
资源详情
资源评论
每日十道面试题每日十道面试题(七七)
每日十道面试题每日十道面试题(七七)
每天看一看小知识增加一下
1. 谈一谈谈一谈Springboot的启动类注解的启动类注解
@springbootApplication其实是一个复合注解,它其实里面由
==@SpringbootConfiguration+@EnableAutoConfiguration+@ComponentScan==三大打手,第一个其实就是标明主启动类是
一个配置类,因为点进去你会发现它就是一个@Configuration的注解,这里先要声明了解一个javaConfig配置的形式
@Configuration+@Bean可以配置到ioc容器中
然后我们接下来重点说剩下两个然后我们接下来重点说剩下两个,@ComponentScan的功能是扫描符合条件的组件把,具体我们点进去看其实它的功能就
是自动扫描并且加载符合条件的组件,讲那些@Component或者那些bean加载到ioc容器中,当然我们可以通过basePackges
来特定一些包来扫描,如果不指定的话就默认扫描==@ComponentScan该类所在的package进行扫描==
然后讲一下然后讲一下@EnableAutoConfiguration,这个最重要,它了。内部有一个@AutoConfigurationPackage+@import,一个是自动
配置包,一个是导入自动配置的组件
@AutoConfigurationPackage它里面注册了一个bean然后它==new packageImport(metadata).getPackageName(),==这一句
话是说明返回了当前主程序的同级和子级的包组件,这也是为什么我们一般那些包都和启动类同级
接下来说接下来说@import它导入的是一个AutoConfigurationImportSelector.class这个类又继承了ImportSelector,这个里面它加载了
WEB/INF/spring.factories外部文件,里面有很多自动配置的类信息,然后这个自动导入选择器会选择符合条件的也就是你需
要用到的然后它会自动配置到ioc容器中
它为什么能自动配置到ioc去,因为SpringFactoriesLoader工具类,它是来帮助从外部文件加载配置的,将那个
org.springfamework.boot.autofigure.EnabletoConfiguration对应的配置项通过反射实例化为javaConfig形式注入到ioc容器中,
后面开启了自动配置的功能,帮助寻找配置文件然后加载到ioc容器
2. 你了解反射,那你知道动态代理吗你了解反射,那你知道动态代理吗?spring中是用哪一种,为什么不用其它的中是用哪一种,为什么不用其它的
实际上这里挖了个坑,就是看你对源码了不了解,
动态代理可以在运行期间动态的获取目标源的信息,从而执行它的方法,静态代理是编译期就确定好的,实质是代码改变的
话,动态代理比较好,不经常变需求的话,静态代理比较好
下面是jdk动态代理
public class ProxyHandller implements InvocationHandler {
private Object target;
public ProxyHandller(Object target){
this.target=target;
}
public Object getProxy() throws Exception {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=method.invoke(target,args);
return result;
}
}
实际jdk是需要代理接口的,通过获取代理的接口类加载器和接口,来获取接口类的实例,从而再利用实例调用invoke反射执
行接口的方法
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理来处理。
而而cglib动态代理是利用动态代理是利用asm开源包,对代理对象类的开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理文件加载进来,通过修改其字节码生成子类来处理。
如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
如果目标对象实现了接口,可以强制使用CGLIB实现AOP
如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
//Cglib动态代理,实现MethodInterceptor接口
public class CglibProxy implements MethodInterceptor {
private Object target;//需要代理的目标对象
资源评论
weixin_38587705
- 粉丝: 0
- 资源: 930
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功