关于业务层的Spring,IoC、DI、AOP的核心概念需要掌握
(一)Head First
(1)什么是Spring
- Spring是一个轻量级开源框架
- 优点
- AOP,面向切面编程
- 将对象的依赖关系交给Spring处理,降低组件之间的耦合性
- 对主流框架(Hibernate、MyBatis、Struts2)支持
- full stack框架
- Web层:SpringMVC
- 业务层:Spring
- 持久层:SpringJDBC
- Spring版本:3.x or 4.x
- 核心:IoC、AOP
(2)IoC
- IoC(Inverse of Control)控制反转:将对象交给容器管理
- 作用:降低了程序的耦合性
- 使用Spring工厂的例子:
//创建工厂,加载核心配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//从工厂中获取对象
UserServiceImpl userServiceImpl = (UserServiceImpl) applicationContext.getBean("userService");
//调用对象的方法
userServiceImpl.sayHello();
(3)工程步骤
Idea环境下创建Spring项目
- 导入Jar包(Idea环境下创建Spring项目选download)
- 核心包 + 2个日志包
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
(4)applicationContext.xml
- applicationContext.xml是Spring的配置文件,放在src目录下
- < bean>标签:id唯一,表示类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--bean标签-->
<!--将实现类和对应id绑定-->
<bean id="userService" class="com.mio4.demo2.UserServiceImpl"/>
</beans>
(1)bean标签
- bean中的属性
- class:bean对象的全路径
- scope
- singleton:单例(配置Service和Dao)
- prototype:多例(配置Action)
- request:每次Http请求创建一个新的bean
- session
- globalsession:多服务器(集群)
- init-method:对象创建时调用
- destroy-method:对象销毁时调用
(5)依赖注入
可以察觉到的是Spring将很多代码的编写转移到对于applicationContextx.xml文件的配置上,依赖注入也是通过配置bean标签实现
- DI(Dependency Injection)依赖注入
- 从工厂中获取对象(而非直接new)
- 在配置文件中创建bean时传参,而非直接传入参数
- 优点:降低了程序的耦合性
<bean id="userService" class="com.mio4.demo2.UserServiceImpl" init-method="init" destroy-method="destroy">
<property name="name" value="mio from di"/>
</bean>
(1)属性注入
- 对于类的属性,有两种注入方式
- 1.构造器注入
- 2.Setter注入
- 对于Car1提供有参构造器:对应配置constructor-arg
- 对于Person提供参数的Setter方法:对于配置property
<!--构造方法的注入方式-->
<bean id="Car1" class="com.mio4.demo4.Car1">
<!--<constructor-arg name="cname" value="benz"/>
<constructor-arg name="price" value="200000"/>-->
<constructor-arg index="0" value="porsche"/>
<constructor-arg index="1" value="1000000"/>
</bean>
<!--Setter的注入方式-->
<bean id="Car2" class="com.mio4.demo4.Car2">
<property name="cname" value="mustang"/>
<property name="price" value="1" />
</bean>
(2)集合注入
- 如果属性是集合类型(数组、List、Map)
- property→list→value/ref
//关于数组的配置
<bean id="User" class="com.mio4.demo4.User">
<property name="arr">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
//关于list的配置
<property name="list">
<list>
<value>l1</value>
<value>l2</value>
</list>
</property>
//关于Map的配置
<property name="map">
<map>
<entry key="k1" value="v1"></entry>
</map>
</property>
</bean>
(3)Util.properties注入
<property name="pro">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>