2, 通过spring进行属性注入
setter方法注入
布局器注入
接口注入
上面的代码中,ClassA依赖于InterfaceB的实现,如何得到InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起授予clzB。
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB逼迫转型后为ClassA所用。
这便是接口注入的一个最原始的雏形。
而对付一个Type1型IOC容器而言,加载接口实现并创建实在例的事情由容器完成,如J2EE开拓中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。
Apache Avalon是一个范例的Type1型IOC容器。
p标记的利用
<bean p:username=\公众\"大众></bean>
3, 将一个工具注入到另一个工具<ref bean=\"大众...\公众>
用户有一个部门
部门有多个用户
model:
配置文件:
测试:
4, AutoWired(byType, byName)
autowire
自动装载:
byName根据名字自动注入
user1的bean中并没有dept属性,但是还是打印出了这个属性,由于它会找到这个类,然后在配置文件中找到和该属性同名的id,并自动注入
byType根据类型自动装载,用法同等
须要把稳,如果根据类型自动装载,应只有一个该类型,否则会无发找到,报错
autowire默认default,指的是根据<beans>声明中得来选择方法
5, scope, lazy-init, init-method, destroy-method(相称的不主要)
scope=\"大众singleton(单例) / prototype(原型)\公众
默认情形下Spring中定义的Bean因此单例模式创建的。
在GoF中的单例模式是指一个ClassLoader中只存在类一个实例。
而在Spring中的单例实际上更确切的说该当是:
1.每个Spring Container中定义的Bean只存在一个实例
2.每个Bean定义只存在一个实例。
lazy-init (一开始不初始化,用到的时候才初始化)
init-method=\"大众init\公众 destory-method=\公众destory\公众 不要和prototype一起利用
类被初始化的时候调用init,被消亡的时候调用destory
正常运行的结果只有一个init和destroy,虽然两个service实例化,但是默认是单例,加了scope=prototype就运行不正常了,结果两个init,没有destroy,缘故原由未知。
首先我们该当知道:
一、spring Bean的浸染域:scope=singleton(默认,单例,天生一个实例)
二、spring Bean的浸染域:scope=prototype(多线程, 天生多个实例)
三、单例模式,默认在程序初始化的时候实例化(lazy-init=”false”)
四、prototype,getBean的时候才是实例化
五、lazy-init 只对单例模式起浸染,对 prototype 不起浸染(由于 prototype 默认就不是程序初始化的时候实例化的)