目录
spring配置文件详解
spring的依赖注入和控制反转梳理总结,仅供参考
/**
* Bean的依赖注入:
* ① 创建 UserService,UserService 内部在调用 UserDao的save() 方法
* ② 将 UserServiceImpl 的创建权交给 Spring
* ③ 从 Spring 容器中获得 UserService 进行操作
*
* Bean的依赖注入分析:
* ① 目前UserService实例和UserDao实例都存在与Spring容器中,
* 当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合。
* ② getBean(name:"userService")获得UserService实例,
* 发现UserSrvice实例内部需要UserDao实例的save()方法,
* 其内部已经存在UserDao实例了,直接调用UserDao的save()方法即可
* ③ 所以在UserService内部获得UserDao实例getBean(name:"userDao"),
* 相当于是在Spring容器外将Dao组装到Service内部完成的操作
*
* Bean的依赖注入概念:
* 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
* 在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
* IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
* 那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
* 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取
*
* Bean的依赖注入方式:
* 怎么将UserDao怎样注入到UserService内部呢?
* 构造方法
* set方法
*
* Bean的依赖注入的三种数据类型:
* 普通数据类型
* 引用数据类型
* 集合数据类型
* 除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。下面在dao中演示普通数据类型和集合数据类型的注入
* @param args
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--Bean标签基本配置 用于配置对象交由Spring 来创建。默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
id:Bean实例在Spring容器中的唯一标识,不允许重复
class:Bean的全限定名称
scope:Bean标签范围配置,指对象的作用范围,取值如下:
singleton 默认值,单例的
当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
prototype 多例的
当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
factory-method:指定类中工厂方法名称
property
name:属性名称
value:注入的普通属性值
ref:注入的对象引用值
constructor-arg
Bean实例化三种方式:
无参构造方法实例化(最常用)
工厂静态方法实例化
工厂实例方法实例化
-->
<!--在Spring配置文件中配置UserDaoImpl-->
<!--1.无参构造方法实例化 它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败-->
<!--<bean id="userDao" class="com.example.ioc.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"/>-->
<!--2.工厂静态方法实例化,工厂的静态方法返回Bean实例-->
<!--<bean id="userDao" class="com.example.ioc.factory.StaticFactory" factory-method="getUserDao"/>-->
<!--3.工厂实例方法实例化,工厂的非静态方法返回Bean实例
spring创建factory工厂对象
从factory工厂对象中的getUserDao方法获取指定的userDao返回的UserDaoImpl对象-->
<!--<bean id="factory" class="com.example.ioc.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>-->
<!--Bean依赖注入操作:
Bean的依赖注入的三种数据类型:
普通数据类型
引用数据类型
① set方法注入
方式1:配置Spring容器调用set方法进行注入
property属性标签
name:属性名称
value:注入的普通属性值
ref:注入的对象引用值
list
map
props
方式2:p命名空间注入 引入p命名空间
② 构造方法注入
集合数据类型
-->
<bean id="userDao" class="com.example.ioc.dao.impl.UserDaoImpl">
<!--普通数据类型注入-->
<property name="username" value="zhangsan"/>
<property name="age" value="20"/>
<!--集合数据类型注入-->
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="userMap">
<map>
<entry key="u1" value-ref="user1"></entry>
<entry key="u2" value-ref="user2"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="p1">ppp1</prop>
<prop key="p2">ppp2</prop>
<prop key="p3">ppp3</prop>
</props>
</property>
</bean>
<bean id="user1" class="com.example.ioc.domain.User">
<property name="name" value="tom"/>
<property name="addr" value="beijing"/>
</bean>
<bean id="user2" class="com.example.ioc.domain.User">
<property name="name" value="lucy"/>
<property name="addr" value="tianjin"/>
</bean>
<!--② 将 UserServiceImpl 的创建权交给 Spring-->
<!--<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl"/>-->
<!--set方法注入
配置Spring容器调用set方法进行注入
把userDao通过userService中的setUserDao方法注入给userService
name指的的是setUserDao中UserDao,只是要小写
ref引用:指的是容器中的id-->
<!--<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>-->
<!--set方法注入 方式2 p命名空间注入 引入p命名空间-->
<!--<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>-->
<!--构造方法注入-->
<bean id="userService" class="com.example.ioc.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
<!--Spring容器加载外部jdbc.properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--数据源配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--import标签:导入其他的Spring的分文件 分模块开发
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,
所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载-->
<import resource="applicationContext-ioc.xml"/>
<import resource="applicationContext-jdbc.xml"/>
</beans>