目录
- spring配置文件详解
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 相当于 sessioninit-method:指定类中的初始化方法名称destroy-method:指定类中销毁方法名称factory-method:指定类中工厂方法名称propertyname:属性名称value:注入的普通属性值ref:注入的对象引用值constructor-argBean实例化三种方式: 无参构造方法实例化(最常用) 工厂静态方法实例化 工厂实例方法实例化--><!--在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:注入的对象引用值listmapprops方式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方法注入给userServicename指的的是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>