Spring相关

参考

参考文章:Java充电社

Spring

IOC:控制反转

含义:将对象的创建交给spring去管理。
实现:在spring配置文件中,bean标签引入。
测试:通过ClassPathXmlApplicationContext加载配置文件,getBean()获取对象。

AOP:面向切面编程

预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

Bean标签属性

scope

bean作用域 <bean id="scopeBean" class="com.hzxes.BeanScopeModel" scope="singleton">

  1. singleton 单例 默认方式

单例整个spring容器中只会存在一个bean实例,通过容器多次查找bean的时候(调用BeanFactory的getBean方法或者bean之间注入依赖的bean对象的时候),返回的都是同一个bean对象

  1. prototype 多例

通过容器每次获取的bean都是不同的实例,每次获取都会重新创建一个bean实例对象。

以下在spring web容器环境中才会有的。

  1. request

在一次http请求中,一个bean对应一个实例;对每个http请求都会创建一个bean实例,request结束的时候,这个bean也就结束了,request作用域用在spring容器的web环境中,这个以后讲springmvc的时候会说,spring中有个web容器接口WebApplicationContext,这个里面对request作用域提供了支持

  1. session

session级别共享的bean,每个会话会对应一个bean实例,不同的session对应不同的bean实例

  1. application

一个web应用程序对应一个bean实例,和singleton效果类似的,singleton是每个spring容器中只有一个bean实例,一般我们的程序只有一个spring容器,但是,一个应用程序中可以创建多个spring容器,不同的容器中可以存在同名的bean,但是sope=aplication的时候,不管应用中有多少个spring容器,这个应用中同名的bean只有一个。

depend-on

干预bean创建和销毁顺序: <bean id="bean1" class="" depend-on="bean2,bean3; bean4" />

问题:当从容器中按照类型查找一个bean对象的时候,容器中却找到了多个匹配的bean
解决方案:

primary

1.可以通过bean元素的primary属性来指定当前bean为主要候选者
eg:<bean id="serviceA" class="com.hzxes.PrimaryBean$ServiceA" primary="true"/>

autowire-candidate

2.设置当前bean在被其他对象作为自动注入对象的时候,是否作为候选bean,默认值是true。
eg:<bean id="serviceA" class="com.hzxes.PrimaryBean$ServiceA" autowire-candidate="false"/>

lazy-init

属性来配置bean是否是延迟加载,true:延迟初始化,false:实时初始化
<bean lazy-init="true" />

abstract=“true” & parent=“baseService”

1.bean元素的abstract属性为true的时候可以定义某个bean为一个抽象的bean,相当于定义了一个bean模板,spring容器并不会创建这个bean,从容器中查找abstract为true的bean的时候,会报错BeanIsAbstractException异常

2.bean元素的parent属性可以指定当前bean的父bean,子bean可以继承父bean中配置信息,也可以自定义配置信息,这样可以覆盖父bean中的配置

单例bean中使用多例bean

1.ApplicationContext接口的方式,实现了这个接口中的setApplicationContext方法,spring容器在创建ServiceB的时候会自动调用setApplicationContext方法。

2.lookup-method:方法查找,可以对指定的bean的方法进行拦截,然后从容器中查找指定的bean作为被拦截方法的返回值

3.replaced-method:方法替换,可以实现bean方法替换的效果,整体来说比lookup-method更灵活一些

代理

jdk动态代理

创建方式1:
1.调用Proxy.getProxyClass方法获取代理类的Class对象
2.使用InvocationHandler接口创建代理类的处理器
3.通过代理类和InvocationHandler创建代理对象
4.上面已经创建好代理对象了,接着我们就可以使用代理对象了

创建方式2:
1.使用InvocationHandler接口创建代理类的处理器
2.使用Proxy类的静态方法newProxyInstance直接创建代理对象
3.使用代理对象

cglib代理

1.创建Enhancer对象
2.通过setSuperclass来设置父类型,即需要给哪个类创建代理类
3.设置回调,通过MethodInterceptor实现了Callback接口
4.获取代理对象,调用enhancer.create方法获取代理对象,这个方法返回的是Object类型的,所以需要强转一下
5.调用代理对象的方法

区别

1.Java动态代理只能够对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类为Proxy,Java类继承机制不允许多重继承);CGLIB能够代理普通类;
2.Java动态代理使用Java原生的反射API进行操作,在生成类上比较高效;CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效

加不加@Configuration注解,有什么区别?

@Configuration注解修饰的类,会被spring通过cglib增强处理,通过cglib会生成一个代理对象,代理会拦截所有被@Bean注解修饰的方法,可以确保一些bean是单例
不管@Bean所在的类上是否有@Configuration注解,都可以将@Bean修饰的方法作为一个bean注册到spring容器中

@ComponentScan

1.@ComponentScan用于批量注册bean,spring会按照这个注解的配置,递归扫描指定包中的所有类,将满足条件的类批量注册到spring容器中
2.可以通过valuebasePackagesbasePackageClasses 这几个参数来配置包的扫描范围
3.可以通过useDefaultFiltersincludeFiltersexcludeFilters这几个参数来配置类的过滤器,被过滤器处理之后剩下的类会被注册到容器中
4.指定包名的方式配置扫描范围存在隐患,包名被重命名之后,会导致扫描实现,所以一般我们在需要扫描的包中可以创建一个标记的接口或者类,作为basePackageClasses的值,通过这个来控制包的扫描范围
5.@CompontScan注解会被ConfigurationClassPostProcessor类递归处理,最终得到所有需要注册的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值