spring(IOC实例化与DI依赖注入)
spring框架概念
Spring是众多开源Java项目中的一员,基于分层的JavaEE应用一站式轻量级开源框架,主要核心是 IOC(控制反转/依赖注入)与Aop(面向切面)两大技术,实现项目在开发过程中的轻松解耦,提高项目的开发效率。在项目中引入Spring立即带来下面的好处。降低组件之间的耦合度,实现软件各层直接的解耦。可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手动控制事务,也不需要处理复杂的事务传播。容器提供单例模式支持,开发人员就不再需要自己编写实现代码。容器提供了AOP技 术,利用它很容易实现如权限拦截、运行期监控等功能。
spring框架环境搭建
1.创建maven项目
2.基于maven创建普通java工程并调整整体工程环境
3.坐标依赖添加Spring框架核心坐标添加
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version> </dependency>
4.编写bean
public class UserService {
public void print(){
System.out.println("Hello Spring");
}
}
5.spring配置文件的编写
在src下新建xml文件,并拷贝官网文档提供的模板内容到xml中,配置bean到xml中,把对应bean纳入到spring容器来管理.
<?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="userService" class="com.mage.service.UserService"></bean>
</beans>
6.编写测试类TestSpring
public class TestSpring {
public static void main(String[] args) {
//Spring框架加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
UserService userService=applicationContext.getBean("userService", UserService.class);
userService.print();
}
}
7.验证spring框架环境是否搭建成功
验证方式通过junit4进行验证
加载xml文件的方式有两种,一般使用第一种
-
通过当前类路径的方式加载xml文件,启动spring容器框架
-
根据文件系统方式寻找配置文件,启动spring容器框架(不推荐)
思考:Bean是如何被实例化的?—工厂模式
Spring的核心容器视线了IOC,BeanFactory和ApplicationContext是了解Spring核心的关键。
Spring中最基本、最重要的包是org.springframework.beans和org.springframework.context。框架中代码大量
引用了Java中的反射机制,为Spring的反向控制特性提供了基础。
BeanFactory提供了一种配置机制来管理任何种类的Bean。
ApplicationContext建立在BeanFactory之上,并增加了其他的功能,比如对国际化的支持、获取资源、事件传递
等。
spring Ioc实例化Bean对象的三种方式
构造器方式实例化bean对象
<bean id="userService" name="userService" class="com.mage.service.UserService"></bean>
通过默认构造器创建空构造方法必须存在否则创建失败
静态工厂模式
特点:
-
要有该工厂类及工厂方法
-
工厂方法是静态的
-
StaticFactory静态工厂
/**
* 静态工厂模式
* @author lxb
*
*/
public class StaticFactory {
public static GoodsService createGoodsService(){
return new GoodsService();
}
}
GoodsService实体类
public class GoodsService {
public void getGoodsInfo(){
System.out.println("GoodsService!");
}
}
Bean配置
<?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="goodsService"
class="com.mage.factory.StaticFactory" factory-method="createGoodsService">
</bean>
</beans>
当我们指定Spring使用静态工厂方法来创建Bean实例时,Spring将先解析配置文件,并根据配置文件指定的信息, **通过反射调用静态工厂类的静态工厂方法,并将该静态工厂方法的返回值作为Bean实例,**在这个过程中,Spring不再负责创建Bean实例,Bean实例是由用户提供的静态工厂方法提供的。
实例化工厂方式
<!-- 实例化工厂
1、定义实例化工厂bean
2、引用工厂bean指定工厂创建方法(方法为非静态)
-->
<bean id="InstanceFactory" class="com.mage.factory.InstanceFactory"></bean>
<bean id="goodsService" factory-bean="instanceFactory" factory- method="createGoodsService"></bean>
Spring三种实例化bean的方式比较
方式一:**通过bean的缺省构造函数创建,**当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。
方式二:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处
理,则可用这个factory方法先进行统一的处理等等。
方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,
1、可用于集成其他框架的bean创建管理方法
2、能够使bean和factory的角色互换
开发中项目一般使用一种方式实例化bean,项目开发基本采用第一种方式,交给spring托管,使用时直接拿来使用即可,另外两种了解即可。
spring依赖注入
spring Ioc注入
set注入
xml配置(同时spring也提供了对于基本数据类型的set注入方式)
<?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="userDao" class="com.mage.dao.UserDao">