Spring
由来
开发框架,一开始是JavaEE的延伸,我们只需往进添加内容即可
EJB
企业级JavaBean(即企业级Java对象),必须部署在容器里边才可以,主要解决service和dao层之间的连接问题;
例如:当service层new了dao层的对象之后需要调用多个dao层的方法,而多个方法之间又是有关联性的(如转账收钱操作),按照以前的逻辑去做可能会使得第一个方法执行完毕数据库连接意外中断从而导致之后的方法得到不一样的数据库连接造成数据的不一致。
而EJB可以将有关联的多个方法处理成事务,这样会保证前后方法所得到的的数据库连接是一样的不会造成数据不一致,即便数据库连接意外中断事务也是可以回滚的;
但是由于EJB的写法及运行都比较麻烦,所以出现了Spring
Spring
Spring目前所属的公司是Pivotal。
Spring提供EJB可以通过容器提供的功能
相对于EJB**,Spring是一个轻量级的框架**,框架是结构化的软件,可以快速创建我们所需的软件,运行时表现为一个容器,可以管理对象的生命周期,从而提供DI、AOP、DAO、事务处理。
根据配置文件去创建对象再放到容器中,对Java对象没有特殊要求,可以为Java的企业级开发提供核心支撑;
可以提供的的功能有:
如依赖注入(DI,也叫反向控制IOC)、面向方面编程(AOP)、数据访问集成、事务管理、Web应用等。
Spring是模块化的,所以可以只使用其中需要的部分。
实例化Bean
构造方法
<bean id="userService1" class="com.wx.service.UserService"></bean>
实例工厂
<bean id="userFactory2" calss="com.wx.service.UserServiceFactory2"></bean>
<bean id="userService2" factory-bean="userFactory2" factory-method="create""></bean>
先建立工厂实例,再调用工厂方法
静态工厂
<bean id="userService3" factory-method="create" class="com.wx.service.UserServiceFactory3"></bean>
Spring容器里的对象是单例的
FactoryBean
<bean id="userService4" class="com.wx.service.UserServiceFactory4"></bean>
依赖注入
DI,也叫控制反转IOC,就是依赖的对象通过Spring设置进来,
依赖注入的方式有:
构造函数注入
使用constructor-arg标签
<bean id="googs1" class="com.wx.week.goods.service.GoodsService">
<constructor-arg name="dao" value="苹果dao" index="0" type="com.wx.week.goods.dao.GoodsDao"></constructor-arg>
</bean>
但是构造函数会形成循环依赖,最终导致对象无法实例化成功,所以尽量不要使用构造函数注入
Setter注入
使用property标签,
注意:这些属性在原有类中是必须有其对应的set方法的
<bean id="student" class="com.wx.service.student.StudentService">
<property name="name" value="小李"></property>
<property name="price" value="12" ></property>
</bean>
注解注入
直接写成员变量
@Service("goodsService")
public class GoodsService{
@Autowired
private IGoodsDao = null;
}
注意:
使用注解注入后需要在配置文件中进行组件扫描,给出需要扫描的路径,Spring会根据这个路径对加有注解的类及方法进行处理。
自动注入
Spring实例化对象之后看是否还需要其他东西再设置进来
通过byName获取(set方法后的名称,如setDao中的‘dao’,找上下文中id为dao)
<bean id="dao" class="com.wx.week.goods.dao.GoodsDao" autowire="byName"></bean>
通过byType获取(set方法的参数类型)
<bean id="dao" class="com.wx.week.goods.dao.GoodsDao" autowire="byType"></bean>
通过constructor获取(构造方法参数名称)
<bean id="dao" class="com.wx.week.goods.dao.GoodsDao" autowire="constructor"></bean>
可注入的类型
基本类型
<bean id="goods" class="com.wx.week.goods.service.bo.Goods">
<property name="name">
<value> 小李</value>
</property>
<property name="price">
<value>25</value>
</property>
</bean>
注意: String和基本类型注入一致
引用类型
<bean id="goodsService" class="com.wx.week.goods.service.GoodsService">
<property name="dao" ref="goodsDao"></property>
</bean>
注意:
ref属性依赖的是bean标签里class属性所表示的类对象中的变量所属的类
即GoodsService类中有成员变量dao且该变量的类型为IGoodsDao,但是这是一个接口是不可以实例化的,所以此时ref属性依赖的类是该接口的子类GoodsDao
集合&数组
指的是让Spring帮我们创建
<!--数组类型属性注入-->
<bean id="goods" class="com.wx.week.goods.service.bo.Goods">
<property>
<array>
<value>1</value>
<value>2</value>
<value>3</value>
</array>
</property>
</bean>