Spring
Spring
Spring是loc和aop的容器。解决了对象的创建和对象的使用分离。使得程序符合开闭原则。对扩展开放,对修改关闭。使得程序有很好的可维护性。可扩展性。
Ioc
loc:inversion of control:控制翻转,控制是指对象的创建权利,反转是指将对象创建权利转移出去,让Spring容器去创建对象。
Spring容器类
ClassPathXmlApplicationContext类就是Spring的容器类,该类在实例化时会通过构造函数加载Spring配置文件
classPathXmlApplicationContext c=new classPathXmlApplicationContext("beans.xml");
加载配置文件后Spring容器就会解析配置文件,根据配置的节点创建对象。创建后的对象都被存储在Spring容器中。从Spring容器中获取Spring创建的对象。
ctx.getBean(beanname);
DI
Dependency Injection:依赖注入,在Spring配置文件中使用节点实现的
<property name="dao" ref="dao"></property>
Spring创建bean的方式
-
使用xml的bean节点创建bean
<bean id="dao" class="com.it.laobing.maven.UserMySQLDAO"></bean>
-
使用静态工厂创建Bean
public class BoyStaticFactory{ public static Boy createInstance(){ return new Boy(); } } Spring的配置文件 <bean id="boy1" class="BoyStaticFactory" factory-method="createInstance">
-
使用实例工厂的创建Bean
public class BoyStaticFactory{ public Boy createInstanceBoy(){ return new Boy(); } } spring的配置文件 <bean id="boyStaticFactory" class="BoyStaticFactory"></bean> <bean id="boy" factory-bean="boyStaticFactory" factory-method="createInstanceBoy"></bean>
-
使用注解创建bean对象(推荐使用)
@Component:组件
@Controller:专门表示控制器的bean
@Service:专门表示业务类的bean
@Repository:专门表示dao类
实际上着四个注解使用上没有区别,可以用@Controller标注在Service类上。
依赖注入Bean的方式
-
构造函数注入
public class Boy { IPet pet; public Boy(IPet pet) { this.pet = pet; } public IPet getPet() { return pet; } public void feed(String food) { pet.eat(food); } } 第二步:spring配置文件 <bean id="cat" class="com.kaifamiao.maven.bean.Cat"></bean> <bean id="boy" class="com.kaifamiao.maven.bean.Boy"> <constructor-arg index="0" type="com.kaifamiao.maven.bean.IPet" ref="cat"></constructor-arg> </bean>
-
set方法注入
public class Boy { IPet pet; public IPet getPet() { return pet; } //set方法注入Bean public void setPet(IPet pet) { this.pet = pet; } public void feed(String food) { pet.eat(food); } } 第二步:spring配置文件 <bean id="cat" class="Cat"></bean> <bean id="boy" class="Boy"> <property name="pet" ref="cat"></property> </bean>
-
自动注入
Spring提供了5种自动注入的方式,no,byName,byType,constructor和autodetect。在bean节点中使用autowrite属性可以设置bean注入的方式。
- no:no模式是不采用任何形式的自动注入,完全依赖手动明确配置各个bean之间的依赖关系。
- byName:按照类中声明的实例变量的名称,与xml配置文件中声明的bean名称进行匹配。
- byType:分析响应依赖对象的类型,然后在容器所管理的所有bean定义中查找与依赖对象类型相同的bean。然后将符合条件的bean自动注入到当前bean定义中。如果在容器种有很多符合条件的bean定义,容器返回异常。
- constructor
- autodetect
Bean的作用域
Bean对象的作用域是指Bean对象的使用范围
在节点的scope属性设置bean的作用域
<bean id="cat" class="Cat"scope="session"></bean>
Scope的值有四个
- singleton:单利(默认值)
- prototype:原型模式(多例模式)
- request:请求模式
- session:会话模式
Bean的懒加载与Bean的立即加载
- lazy-init=“false”
- lazy-init=“true”
设置单独配置加载会有些麻烦,可以在beans节点上对所有的bean进行全局配置。
default-lazy-init="default"
Bean的生命周期
- 初始化
- 销毁
Spring配置优化
-
依赖注入(DI)的优化
-
使用注解代替xml配置
-
第一步在spring配置文件的命名空间声明中添加context。
-
第二步:在spring的配置文件中启用注解 <context:annotation-config />
-
第三步:在类的属性名称上标注注解
-
@Autowired
根据类型自动将spring容器中的bean对象注入到该属性。如果spring容器中需要注入类型的bean对象有多个,那么spring容器会抛出异常
-
@Qualifier
@Qualifier注解与@Autowired配合使用,其中@Autowired明确注入的类型,而@Qualifier明确注入的名称
-
@Resource
@Resource是根据名称注入,该注解是@Autowired和@Qualifier的组合体,注意@Resource不是spring提供了,而是JavaEE提供的,使用时需要导入annotation- api.jar
-
-
-
控制反转(IOC)的优化
-
第一步:在spring配置文件的命名空间声明中添加context。
-
第二步:在spring配置文件中启动组件扫描 <context:component-scan base-package=“com.kaifamiao.maven.bean”/>
-
在类上标注注解
- @Controller 标注在控制器类上
- @Service 标注在业务类上
- @Repository 标注在DAO类上
- @Component 标注在非控制器,非业务,非DAO的类上
-
-
作用域的优化
- @Scope
-
生命周期的优化
- @postConstruct Spring提供了@PostConstruct用于初始化
- @preDestory Spring提供了@ PreDestroy用于销毁
-
Spring 的java-based配置
-
@Configuration
@Configuration注解用于标注在类上,标注了@Configuration注解的类将作为bean定义的来源。此外@Configuration类允许bean之间依赖,只需简单地调用该类中其他的@Bean方法。
-
ImportResources
@ImportResource注解标注在类上,表示该类导入的外部资源,例如beans.xml。
-
@Bean
@Bean注解用于标注在方法上,表示一个方法实例化、配置、初始化一个新的被Spring容器管理的bean对象。@Bean注解相当于xml配置文件中的。@Bean通常和@Configuration注解一起使用。
-