写的非常详细(慕课网笔记):
Spring的Bean管理: https://blog.csdn.net/weixin_41963657/article/details/90209827
Spring的属性注入:https://blog.csdn.net/weixin_41963657/article/details/90208653
Spring Bean管理——XML方式 -------------------------------->Spring Bean管理——注解方式
使用xml配bean
三种实例化Bean的方式:
*使用类构造器实例化(默认无参数)
*使用静态工厂方法实例化(简单工厂模式)
*使用实例工厂方法实例化(工厂方法模式)
一般情况下采用第一种方式,当构造比较复杂时采用二三种方法
- 1.无参实例化:
配置id、类 - 2.静态工厂实例化:
创建工厂方法,配置id、工厂类、工厂方法(factory-method属性) - 3.实力工厂实例化:
没有静态方法
配置两个bean
一个配置id、工厂类
一个配置id、工厂id(factory-bean属性)、工厂类方法(factory-method属性)
<!--Bean的实例化的三种方式============================-->
<!--第一种:无参构造器的方式-->
<!--<bean id="bean1" class="com.imooc.ioc.demo2.Bean1"/>-->
<!--第二种:静态工厂的方式-->
<!--<bean id="bean2" class="com.imooc.ioc.demo2.Bean2Factory" factory-method="createBean2"/>-->
<!--第三种:实例工厂的方式-->
<!--<bean id="bean3Factory" class="com.imooc.ioc.demo2.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/>-->
<!--Bean的作用范围=====================================-->
<!--<bean id="person" class="com.imooc.ioc.demo3.Person" scope="prototype"/>-->
<!-- <bean id="man" class="com.imooc.ioc.demo3.Man" init-method="setup" destroy-method="teardown">
<property name="name" value="张三"/>
</bean>-->
<!-- <bean class="com.imooc.ioc.demo3.MyBeanPostProcessor"/>
<bean id="userDao" class="com.imooc.ioc.demo3.UserDaoImpl"/>-->
<!--Bean的构造方法的属性注入=============================-->
<!-- <bean id="user" class="com.imooc.ioc.demo4.User">
<constructor-arg name="name" value="张三" />
<constructor-arg name="age" value="23"/>
</bean>-->
<!--Bean的set方法的属性注入==============================-->
<!-- <bean id="person" class="com.imooc.ioc.demo4.Person">
<property name="name" value="李四"/>
<property name="age" value="32"/>
<property name="cat" ref="cat"/>
</bean>
<bean id="cat" class="com.imooc.ioc.demo4.Cat">
<property name="name" value="ketty"/>
</bean>-->
Spring的属性注入(DI)
- DI的3种方式
构造函数——Spring支持
在元素里声明属性
属性setter——Spring支持
接口注入
开发中一般使用setter方法注入
<!--Bean的构造方法的属性注入=============================-->
<!-- <bean id="user" class="com.imooc.ioc.demo4.User">
<constructor-arg name="name" value="张三" />
<constructor-arg name="age" value="23"/>
</bean>-->
<!--Bean的setter方法的属性注入==============================-->
<!-- <bean id="person" class="com.imooc.ioc.demo4.Person">
<property name="name" value="李四"/>
<property name="age" value="32"/>
<property name="cat" ref="cat"/>
</bean>
- p名称空间注入
<!--Bean的p名称空间的属性注入==============================-->
<bean id="person" class="com.imooc.ioc.demo4.Person" p:name="大黄" p:age="34" p:cat-ref="cat"/>
<bean id="cat" class="com.imooc.ioc.demo4.Cat" p:name="小黄"/>
- SpEL的属性注入((注入的属性较为复杂时使用))
<!--Bean的SpEL的属性注入==============================-->
<bean id="category" class="com.imooc.ioc.demo4.Category">
<property name="name" value="#{'服装'}"/>
</bean>
<bean id="productInfo" class="com.imooc.ioc.demo4.ProductInfo"/>
<bean id="product" class="com.imooc.ioc.demo4.Product">
<property name="name" value="#{'男装'}"/>
<property name="price" value="#{productInfo.calculatePrice()}"/>
<property name="category" value="#{category}"/>
</bean>
复杂属相的注入
package com.imooc.ioc.demo5;
import java.util.*;
public class CollectionBean {
private String[] arrs; // 数组类型
private List<String> list;// List集合类型
private Set<String> set; // Set集合类型
private Map<String,Integer> map;// Map集合类型
private Properties properties; // 属性类型
//省略get/set
}
}
<!--集合类型的属性注入=================================-->
<bean id="collectionBean" class="com.imooc.ioc.demo5.CollectionBean">
<!--数组类型-->
<property name="arrs">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<!--List集合的属性注入-->
<property name="list">
<list>
<value>111</value>
<value>222</value>
<value>333</value>
</list>
</property>
<!--Set集合的属性注入-->
<property name="set">
<set>
<value>ddd</value>
<value>eee</value>
<value>fff</value>
</set>
</property>
<!--Map集合的属性注入-->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
<!--Properties的属性注入-->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>
Spring的Bean管理(注解)方式(使用注解定义Bean)
全局扫描:
<context:component-scan base-package=“包名”/>
使用注解定义Bean
*Spring2.5引入使用注解去定义Bean
@Component 描述Spring框架中Bean
*除了@Component外,Spring提供了3个基本和@Component等效的注解
-@Repository 用于对DAO实现类进行标注
-@Service 用于对Service实现类进行标注
-@Controller 用于对Controller实现类进行标注
*这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强
属相注入
Spring的属性注入-注解方式
*使用@Autowired进行自动注入
*@Autowired 默认按照类型进行注入
- 如果存在两个相同Bean类型相同,则按照名称注入
*Autowired注入时可以针对成员变量或者set方法
*通过@Autowired的required属性,设置一定要找到匹配的Bean
*使用@Qualifier指定注入Bean的名称
Spring提供对JSR-250中定义@Resource标准注解的支持
@Resource和@Autowired注解功能相似,默认按照名称注入
Spring的其他注解
Spring初始化bean或者销毁bean时,有时需要做一些处理,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。
传统XML配置和注解配置混合使用
*XML方式的优势
-结构清晰,易于阅读
*注解方式的优势
-开发便捷,属性注入方便
*XML与注解的整合开发
-1、引入context命名空间
-2、在配置文件中添加context:annotation-config标签
<context:component-scan base-package="…"> 包中所有的注解都被解析
context:annotation-config 只解析属性的注解