Spring学习总结(⾮常详细)
距离第⼀次接触Spring框架已经过了有三四个⽉了,有些概念已经忘了,现在来复习⼀下,加深记忆!
1、IOC和DI
1.1、ioc:Inversion of Control 控制反转
    即控制权的转移,将我们创建对象的⽅式反转了,以前对象的创建是由我 们开发⼈员⾃⼰维护,包括依赖关系也是⾃⼰注⼊。使⽤了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注⼊,反转控制就是反转了对象的创建⽅式,从我们⾃⼰创建反转给了程序创建(spring)
1.2、DI: Dependency Injection 依赖注⼊
    spring这个容器中,替你管理着⼀系列的类,前提是你需要将这些类交给spring容器进⾏管理,然后在你需要的时候,不是⾃⼰去定义,⽽是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进⾏查,然后直接给你所需要的组件.
实现IOC思想需要DI做⽀持
注⼊⽅式: 1.set⽅式注⼊ 2.构造⽅法注⼊ 3.字段注⼊
注⼊类型: 1.值类型注⼊ 2.引⽤类型注⼊
优点:
1.降低组件之间的耦合度,实现软件各层之间的解耦.
2.可以使容器提供众多服务如事务管理消息服务处理等等。当我们使⽤容器管理事务时,开发⼈员就不需要⼿⼯ 控制事
务,也不需要处理复杂的事务传播
3.容器提供单例模式⽀持,开发⼈员不需要⾃⼰编写实现代码.
4.容器提供了AOP技术,利⽤它很容易实现如权限拦截,运⾏期监控等功能
5.容器提供众多的辅佐类,使这些类可以加快应⽤的开发.如jdbcTemplate HibernateTemplate
2.applicationContext & BeanFactory区别
2.1、BeanFactory接⼝
(1) spring的原始接⼝,针对原始接⼝的实现类功能较为单⼀
(2)BeanFactory接⼝实现类的容器,特点是每次在获得对象时才会创建对象
2.2、ApplicationContext接⼝
(1)每次容器启动时就会创建容器中配置的所有对象
(2)提供了更多功能
(3)从类路径下加载配置⽂件: ClassPathXmlApplicationContext
从硬盘的绝对路径下加载配置⽂件:FileSystemXmlApplication
3、spring配置详解
3.1、元素属性
bean元素:使⽤该元素描述需要spring容器管理对象
name属性:给被管理的对象起个名字,获得对象时getBean(“name值”)
class属性:被管理对象的完整类名
id属性:与name属性⼀模⼀样,名称不可重复,不能使⽤特殊字符
name和id之间的⼀些注意点:
1、配置两个相同的 id 或者 name 都不能通过。
2、如果既配置了 id ,也配置了 name ,则两个都⽣效。如果id和name都没有指定,则⽤类全名作为name,如,则你
可以通过getBean(“com.stamen.BeanLifeCycleImpl”)返回该实例。
3、如果配置基本类的时候,注解和配置⽂件都使⽤的时候,注解和配置⽂件中 name 相同的时候, 则两个冲突,配
置⽂件⽣效。
如果配置基本类的时候,注解和配置⽂件都使⽤的时候,注解和配置⽂件中 name 不相同的时候, 则两个不冲突,都能够⽣效。
3.2、bean元素进阶( scope属性⽣命周期属性)—————单例多例
3.2.1、scope属性
(1)singleton 默认值
单例对象 :被标识为单例的对象在spring容器中只会存在⼀个实例
(2)prototype
多例原型:被标识为多例的对象,每次在获得才会被创建,每次创建都是新的对象
(3)request
Web环境下,对象与request⽣命周期⼀致
(4)session
Web环境下,对象与session⽣命周期⼀致
总结:绝⼤多数情况下,使⽤单例singleton(默认值),但是在与struts整合时候,务必要⽤prototype多例,因为struts2在每次请求都会创建⼀个新的Action,若为单例,在多请求情况下,每个请求spring拿的都是同⼀个action。
3.2.1、⽣命周期属性(了解)———初始化和销毁
(1)配置⼀个⽅法作为⽣命周期初始化⽅法,spring会在对象创建之后⽴刻调⽤ init-method
(2)配置⼀个⽅法作为⽣命周期的销毁⽅法,spring容器在关闭并销毁所有容器中的对象之前调⽤destory-method
<bean init-method=“init”  destory-method=“destory”></bean>
对应注解为@PostConstruct
<bean name=“hello” class=“完整类名”></bean>
对应注解为@PreDestory
(3)模块化配置,即分模块配置(导⼊其他spring配置⽂件)
<beans>
<import resource = “spring配置⽂件的全路径名” />
</beans>
3.3、spring三种对象的创建⽅式
3.3.1 空参数构造(重要)
<bean name="demo"class="com.it666.spring.demo">
3.3.2静态⼯⼚创建(调⽤静态⽅法创建)
调⽤UserFactory类的静态createUser⽅法创建名为user的对象,放⼊容器
<bean name="user"class="cn.itcats.UserFactory"factory-method="createUser"></bean>
3.3.3、实例⼯⼚创建(调⽤⾮静态⽅法创建)——需要配置两个bean,因为⽆法通过类名调⽤⾮静态⽅法
<bean name="user2"factory-bean="userFactory"factory-method="createUser"></bean>
<bean name=“userFactory”class=“cn.it666.UserFactory”></bean>
3.4、spring注⼊⽅式
3.4.1、 set⽅式注⼊(重点)————值类型⽤value注⼊引⽤类型⽤ref注⼊
<!--set注⼊学⽣类 -->
<bean name="student"class="com.it666.spring.domian.Student">
<property name="name"value="马钊"><property>
<property name="grade"value="80"><property>
<property name="teacher"ref="teacher"><property>
</bean>
<!--set注⼊教师类 -->
<bean name="teacher"class="com.it666.spring.domian.Teacher">
<property name="name"value="李⽼师"><property>
<property name="className"value="java课程设计"><property>
</bean>
3.4.2、构造⽅法注⼊
<bean name="student"class="com.it666.spring.domain.Student">
<!-- name属性:构造函数的参数名称-->
<!-- index属性:构造函数的参数名称-->
<!-- type属性:构造函数的参数名称-->
<constructor-arg name="name" index="1" type="java.lang.String" value="马钊"></constructor-arg>
<constructor-arg name="grade" index="0" type="java.lang.Integer" value="20"></constructor-arg>
<constructor-arg name="teacher" index="2" type="java.lang.String" ref="teacher"></constructor-arg>
</bean>
3.4.3、p命名空间注⼊-实际上set注⼊,spring特有,为了简化写法
1、l中标签头部导⼊p命名空间
xmlns:p="/schema/p"
2、书写格式:值类型注⼊—— p:属性名=“值” 引⽤类型注⼊—— p:属性名-ref=“引⽤的 name属性”把Run类中的name属性值设置为haha,age属性设置为20,引⽤属性hello引⽤
<bean name="run2"class="cn.itcats.thread.Run" p:name="haha" p:age="20" p:hello-ref="hello"></bean>
3、spel注⼊: spring Expression Language spring表达式语⾔
<bean name="runSpel"class="cn.itcats.thread.Run">
<!-- 取bean标签中name为"user"中property为"name"中的value值--!>
<property name="name"value="#{user.name}"></property>
</bean>
3.4.4、复杂类型注⼊
1、数组的注⼊
<!-- 复杂类型注⼊ -->
<bean name="mz"class="com.it666.spring.domain.Collection">
<!-- 如果数组中只准备注⼊⼀个值(对象),直接使⽤value|ref即可 -->
<!-- array注⼊,多元素注⼊ -->
<property name="arr">
<array>
<!-- array数组中的注⼊⽅式 -->
<value>value1</value>
<value>value2</value>
<!-- array数组中引⽤类型注⼊⽅式 -->
<ref bean="teacher"/>
</array>
</property>
<bean>
2、list集合的注⼊
<!-- list类型的注⼊ -->
<property name="list">
<list>
<value>listV1</value>
<value>listV2</value>
<ref bean="teacher"/>
</list>
</property
3、map集合的注⼊
<!-- map类型的注⼊ -->
<property name="map">
<map>
<entry key="mapk1"value="mapV1"></entry>
spring ioc注解<entry key="mapk2"value="mapV2"></entry>
</map>
</property>
4、properties的注⼊
<!-- properties的注⼊ -->
<property name="prop">
<props>
<prop key="driverClass">sql.Driver</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
4、防⽌创建多个applicationContext取值/并指定记载spring配置⽂件的位置——l 1、初始化Spring容器
<!--初始化spring 容器:-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
2、配置
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>
3、指定Spring配置⽂件的位置
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 当load-on-startup的值为1时,表⽰启动容器时,初始化Servlet  -->
</servlet>
5、是⽤注解⽅式代替配置⽂件(官⽅推荐使⽤注解)
5.1、在l中书写指定扫描注解
<component-scan base-package="com.it666.spring.domain"></component-scan>
5.2、在类中书写Component
@Component("student")
@Service("student")
@Controller("student")
@Repository("student")
注意:假如不写括号内的值(即name或id),默认使⽤类名⾸字母⼩写作为搜索,为什么意思呢?
⽐如Student类中使⽤了@Component 没有书写括号和值,那么默认搜索id或name为student
5.3、指定对象的作⽤范围Scope
@Scope(scopeName="propotype")
public class Student{
public String name;
public Integer age;
}
声明Student类对象为多例 下⾯是对singleton和prototype的⼀些补充
singleton作⽤域:当把⼀个Bean定义设置为singleton作⽤域是,Spring IoC容器中只会存在⼀个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同⼀实例。值得强调的是singleton作⽤域是Spring中的缺省作⽤域。
prototype作⽤域:prototype作⽤域的Bean会导致在每次对该Bean请求(将其注⼊到另⼀个Bean中,或者以程序的⽅式调⽤容器的getBean()⽅法)时都会创建⼀个新的Bean实例。根据经验,对有状态的Bean应使⽤prototype作⽤域,⽽对⽆状态的Bean则应该使⽤singleton作⽤域。对于具有prototype作⽤域的Bean,有⼀点很重要,即Spring不能对该Bean的整个⽣命周期负责。具有prototype作⽤域的Bean创建后交由调⽤者负责销毁对象回收资源。
简单的说:
singleton 只有⼀个实例,也即是单例模式。
prototype访问⼀次创建⼀个实例,相当于new。
5.4、值类型的注⼊

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。