Bean(类)包装的是一个 Object,把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
IOC容器
IOC: ioc强调由第三方容器根据客户的需求,创建对象,然后根据客户供的方法将对象传递给客户
容器的本质: 它就是一个map集合,键:id 值:容器创建的对象
DI: 强调第三方创建对象以后 通过什么方法将对象传递过去SpringIOC
XML文件配置方式
一、Bean的创建、获取
1、 <bean id="boyId" class="com.wtu.spring.ioc.type1.Boy">
<property name="name1" value="value1" />
<property name="name2" value="value2" />
</bean>
id:对该Bean的唯一标识
class:类的全路径
2、通过中间类的静态方法创建
<bean id="ClassID" class="com.wtu.spring.bean.create2.Middle"
factory-method="getInstance" />
factory-method:通过中间类的哪个函数来创建对象
3、通过中间类的非静态方法创建
首先注册中间类
<bean id="middleId" class="com.wtu.spring.bean.create3.Middle"/>
//依据中间类来创建对象
<bean id="ClassID"
factory-bean="middleId"
factory-method="getInstance"/>
factory-bean:引用中间类的对象
factory-method:中间类构建对象的方法名称
4、获取Bean对象
//启动IOC容器
//ClassPathXmpApplicationContext(String... configLocations);
ApplicationContext ac = new ClassPathXmlApplicationContext("xmlPath:从src开始");
Class class = (Class) ac.getBean("CLassID");
二、bean的继承
含义:一个Bean可以继承另一个bean的属性
<bean id="parentID" class="parentClass">
<property name="name" value="value"/>
</bean>
<bean id="sonID" class="sonClass" parent="parentID">
<propertym name="name" value="value"/>
</bean>
parent:父亲的ID
三、Bean的单例和多例模式
scope="prototype" 多例
默认情况下时单例
四、Bean的创建的时间
lazy-init="true" 懒汉式
lazy-init="false" 饿汉式
在单例模式下,lazy-init的设置才有用,默认情况下是饿汉式,即当IOC创建后立马创建相关对象
在多例模式下,lazy-init的设置没有用,直到getBean("ID");时才创建对象
五、Spring DI
强调的是给Bean的属赋值。通常将Bean的属性以Set的方式赋值给对象的属性
1、属性: 基本数据类型
<bean id="boyId" class="com.wtu.spring.ioc.type1.Boy">
<property name="name1" value="value1">/<property>
<property name="name2" value="value2">/<property>
</bean>
2、属性: 类类型
<bean id="dateId" class="java.util.Date">
<property name="name" ref="dateId"/>
3、属性: 集合
<property name="list">
<list>
<value>value1</value>
<value>value2</value>
</list>
</property>
<property name="name">
<set>
<value>value1</value>
<value>value2</value>
</set>
</property>
<property>
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>value2</value>
</entry>
</map>
</property>
注解方式
用注解来向Spring容器中注册Bean,需要在applicationCOntext.xml注册
<!--首先开启spring注解的功能 -->
<context:annotation-config/>
<!-- 让springIOC容器自动去扫描某一个包 创建该包下的bean对象 -->
<context:component-scan base-package="com.wtu.spring.di.annotation2"></context:component-scan>
当该包下的某个类的头上带有注解{@Component/@Repository/@Service/Controller}就会将该
类作为Bean注册到Spring容器中
@Controller 对应表现层的Bean,即Action
@Service 对应业务层Bean
@Repository 对应数据访问层Bean
@Component 各层均适用(不推荐)
这四个注解形式在默认情况下,生成的Bean的ID(Key)为首字母小写的类名
也可指定名字eg:@Controller(value="XXX")
@Scope("prototype")只当该Bean可以产生多个对象,默认是单例
注入: 成员变量
@Resource(name="ClassID") 指定已经注册Bean对象的ID,默认按属性名来查找Bean(ByName)
@Autowired 依据成员对量的类型在IOC容器中查找Bean对象(ByType)
XML文件配置和注解形式各有优缺点。
当需要注册的Bean对象来自第三方时,只能通过XML文件配置来实现
扩展:
辅助
Spring Bean的生命周期