Spring中的工厂
ApplicationContext:
ApplicatioContext接口有两个实现类:
ClassPathXmlApplicationContext :加载类路径下Spring的配置文件.
FileSystemXmlApplicationContext :加载本地磁盘下Spring的配置文件.
BeanFactory:
ApplicationContext是BeanFactory的子类,功能比beanFactory更完善。
BeanFactory和ApplicationContext的区别:
BeanFactory :是在getBean的时候才会生成类的实例.
ApplicationContext :在加载applicationContext.xml时候就会创建.
Spring配置文件中提示的配置
开发时需要去查看
Spring的相关配置
id属性和name属性标签的配置
没有id时,可以用name代替,id不能有特殊字符,名字可以有。
scope属性:Bean的作用范围.
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中.
* session :WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中.
* globalSession :WEB项目中,应用在Porlet环境.如果没有Porlet环境那么globalSession相当于session.
Bean的生命周期的配置
通过配置<bean>标签上的init-method作为Bean的初始化的时候执行的方法,配置destroy-method作为Bean的销毁的时候执行的方法。销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭的时候,Bean才会被销毁.
Spring的Bean的管理XML的方式
Spring的Bean的属性注入
【构造方法的方式注入属性】
<!-- 第一种:构造方法的方式 -->
<bean id="car" class="cn.itcast.spring.demo4.Car">
<constructor-arg name="name" value="保时捷"/>
<constructor-arg name="price" value="1000000"/>
</bean>
【set方法的方式注入属性】
<!-- 第二种:set方法的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<property name="name" value="奇瑞QQ"/>
<property name="price" value="40000"/>
</bean>
Spring的属性注入:对象类型的注入:
<!-- 注入对象类型的属性 -->
<bean id="person" class="cn.itcast.spring.demo4.Person">
<property name="name" value="会希"/>
<!-- ref属性:引用另一个bean的id或name -->
<property name="car2" ref="car2"/>
</bean>
名称空间p的属性注入的方式:Spring2.x版本后提供的方式.
第一步:引入p名称空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
第二步:使用p名称空间.
* 普通属性: p:属性名称=””
* 对象类型属性: p:属性名称-ref=””
<!-- p名称空间的属性注入的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2" p:name="宝马7" p:price="1200000"/>
<bean id="person" class="cn.itcast.spring.demo4.Person" p:name="思聪" p:car2-ref="car2"/>
SpEL的方式的属性注入:Spring3.x版本后提供的方式.
SpEL:Spring Expression Language.
语法:#{ SpEL }
<!-- SpEL的注入的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<property name="name" value="#{'奔驰'}"/>
<property name="price" value="#{800000}"/>
</bean>
<bean id="person" class="cn.itcast.spring.demo4.Person">
<property name="name" value="#{'冠希'}"/>
<property name="car2" value="#{car2}"/>
</bean>
<bean id="carInfo" class="cn.itcast.spring.demo4.CarInfo"></bean>
引用了另一个类的属性
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<!-- <property name="name" value="#{'奔驰'}"/> -->
<property name="name" value="#{carInfo.carName}"/>
<property name="price" value="#{carInfo.calculatePrice()}"/>
</bean>
注入复杂类型:
<!-- Spring的复杂类型的注入===================== -->
<bean id="collectionBean" class="cn.itcast.spring.demo5.CollectionBean">
<!-- 数组类型的属性 -->
<property name="arrs">
<list>
<value>会希</value>
<value>冠希</value>
<value>天一</value>
</list>
</property>
<!-- 注入List集合的数据 -->
<property name="list">
<list>
<value>芙蓉</value>
<value>如花</value>
<value>凤姐</value>
</list>
</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">123</prop>
</props>
</property>
</bean>
Spring的分配置文件的开发
一种:创建工厂的时候加载多个配置文件:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二种:在一个配置文件中包含另一个配置文件:
<import resource="applicationContext2.xml"></import>
Spring的Bean管理:(注解方式)
配置注解扫描
<!-- Spring的注解开发:组件扫描(类上注解: 可以直接使用属性注入的注解) -->
<context:component-scan base-package="com.itheima.spring.demo1"/>
在相关的类上添加注解
@Component(value="userDao")
public class UserDaoImpl implements UserDao {
@Override
public void sayHello() {
System.out.println("Hello Spring Annotation...");
}
}
- Spring的Bean管理的中常用的注解:
- @Component:组件.(作用在类上)
Spring中提供@Component的三个衍生注解:(功能目前来讲是一致的)
* @Controller :WEB层
* @Service :业务层
* @Repository :持久层
这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强
属性注入的注解:(使用注解注入的方式,可以不用提供set方法.)
@Value :用于注入普通类型.
@Autowired :自动装配:
* 默认按类型进行装配.
* 按名称注入:
* @Qualifier:强制使用名称注入.
@Resource相当于:
* @Autowired和@Qualifier一起使用.
Bean的作用范围的注解:
@Scope:
* singleton:单例
* prototype:多例
Bean的生命周期的配置:
@PostConstruct :相当于init-method
@PreDestroy :相当于destroy-method
- Spring的Bean管理的方式的比较:
XML和注解:
* XML :结构清晰.
* 注解 :开发方便.(属性注入.)
实际开发中还有一种XML和注解整合开发:
* Bean有XML配置.但是使用的属性使用注解注入.