(1),每一个bean属性,就是一个普通的java类。
类有属性,有方法,如何交给容器管理。(注解的方式,xml方式配置)
(2),通过Bean来实例化对象的方式
1.通过构造器(一般是无参的默认构造器)
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
2.使用静态工厂方法实例化
下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并 未指定返回对象的类型,仅指定该类包含的工厂方法。
在此例中, createInstance()必须是一个static方法。
<bean id="exampleBean"
class="examples.ExampleBean2"
factory-method="createInstance"/>
(3),使用实例工厂方法实例化
(4), 注入依赖
依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:
构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。
因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、
直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入
的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control, IoC) 名字的由来。

应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系
(甚至不知道依赖的定义指定地方和依赖的实际类)之后,实现更高层次的松耦合将易如反掌。
DI主要有两种注入方式,即Setter注入和构造器注入
(5),在采用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况。
比如说,一个类A,需要通过构造器注入类B,而类B又需要通过构造器注入类A。
如果为类A和B配置的bean被互相注入的话,那么Spring IoC容器将检测出循环引用,
并抛出 BeanCurrentlyInCreationException异常。
对于此问题,一个可能的解决方法就是修改源代码,将某些构造器注入改为setter注入。

(6),依赖配置详解
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="masterkaoli"/>
</bean>

(7),各类数据类型的依赖注入

<bean id="moreComplexObject" class="example.ComplexObject"><!-- results in a setAdminEmails(java.util.Properties) call --><property name="adminEmails"><props><prop key="administrator">administrator@example.org</prop><prop key="support">support@example.org</prop><prop key="development">development@example.org</prop></props></property><!-- results in a setSomeList(java.util.List) call --><property name="someList"><list><value>a list element followed by a reference</value><ref bean="myDataSource" /></list></property><!-- results in a setSomeMap(java.util.Map) call --><property name="someMap"><map><entry><key><value>an entry</value></key><value>just some string</value></entry><entry><key><value>a ref</value></key><ref bean="myDataSource" /></entry></map></property><!-- results in a setSomeSet(java.util.Set) call --><property name="someSet"><set><value>just some string</value><ref bean="myDataSource" /></set></property>
</bean>

(8),自动装配
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。
因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,
来替我们指定bean的协作者(其他被依赖的bean)。autowire一共有五种类型。
由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。

<bean id="waiter" class="container.autowire.Waiter"><property name="name" value="宝玉"/></bean><!-- 自动装配byName:容器依据属性名查找对应的bean,然后调用对应的set方法来完成注入。--><!-- <bean id="bar" class="container.autowire.Bar" autowire="byName"/>--><!-- 自动装配byType:容器依据属性类型查找对应的bean,然后调用对应的set方法来完成注入。注意:有可能有多个bean满足条件,会报错。--><!-- <bean id="bar" class="container.autowire.Bar"autowire="byType"/>--><!-- 自动装配constructor:容器依据属性类型查找对应的bean,然后调用对应的构造器来完成注入。注意:有可能有多个bean满足条件,会报错。--><bean id="bar" class="container.autowire.Bar"autowire="constructor"/>

(9)Bean的作用域
当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,
并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
Singleton作用域是Spring中的缺省作用域;(缺省就是默认)
singleton 只有一个实例,也即是单例模式。
prototype访问一次创建一个实例,相当于new。
应用场合:
1.需要回收重要资源(数据库连接等)的事宜配置为singleton,如果配置为prototype需要应用确保资源正常回收。
2.有状态的Bean配置成singleton会引发未知问题,可以考虑配置为prototype。

对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:
容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。

(10)初始化web配置

要使用request、session和 global session作用域的bean(即具有web作用域的bean), 在开始设置bean定义之前,还要做少量的初始配置。请注意,假如你只想要“常规的”作用域,(singleton和prototype),就不需要这一额外的设置。

在目前的情况下,根据你的特定servlet环境,有多种方法来完成这一初始设置...

如果你用Spring Web MVC,即用SpringDispatcherServlet或DispatcherPortlet来处理请求,则不需要做特别的配置:DispatcherServlet 和 DispatcherPortlet已经处理了所有有关的状态

当使用了Spring's DispatcherServlet以外的Servlet 2.4及以上的Web容器时(如使用JSF或Struts),你需要在Web应用的'web.xml'文件中增加 javax.servlet.ServletRequestListener 定义

<web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
如果你用的是早期版本的web容器(Servlet 2.4以前的版本),那么你要使用一个javax.servlet.Filter的实现。请看下面的web.xml配置片段:

<web-app>
..
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
RequestContextListener和RequestContextFilter两个类做的都是同样的工作: 将HTTP request对象绑定到为该请求提供服务的Thread。 这使得具有request和session作用域的bean能够在后面的调用链中被访问到。
Request作用域
考虑下面bean定义:

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。

Session作用域
考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

转载于:https://www.cnblogs.com/lwy19998273333/p/5497614.html

Spring注意事项(各部分理解)相关推荐

  1. Spring松耦合的个人理解和代码实例

    Spring松耦合的个人理解和代码实例 理解Spring的松耦合概念,那么我们先来看看一个不使用Sring的实例代码 先看一下整个测试项目案例的结构 正常方式 创建一个接口,这个接口指定车辆的行驶速度 ...

  2. spring 扫描所有_从Spring的几个阶段理解其工作过程

    首发于博客园,https://www.cnblogs.com/ibigboy/p/11150237.html Spring框架非常强大,想要彻底弄懂Spring是非常困难的. 为了便于初学者了解Spr ...

  3. Spring高手之路——深入理解与实现IOC依赖查找与依赖注入

    本文从xml开始讲解,注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例 2. IOC 的两种实现方式 2.1 依赖查找(Dependency Lookup) 2.2 依赖注入(Depe ...

  4. 对spring cloud config的一点理解

    以下部分纯属个人理解,但是结果都是经过demo验证. 一.spring cloud config介绍 spring cloud是spring家族中的一个微服务工具包,其中包含了很多微服务的工具.偏向于 ...

  5. 太难了~面试官让我结合案例讲讲自己对Spring事务传播行为的理解!

    摘要: 原创出处 sf.gg/a/1190000013341344 「handaqiang」欢迎转载,保留摘要,谢谢! 前言 基础概念 1. 什么是事务传播行为? 2. Spring 中七种事务传播行 ...

  6. Spring基础篇——Spring容器和应用上下文理解

    转载自 https://www.cnblogs.com/chenbenbuyi/p/8166304.html 上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生 ...

  7. 关于Spring事务tx:annotation-driven/的理解(Controller可以使用@Transactional)

    在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用.<tx: ...

  8. boot spring 没有父子容器_理解 MyBatis 是如何在 Spring 容器中初始化的

    MyBatis 初始化过程就是 生成一些必须的对象放到 Spring 容器中 .问题是这个过程到底生成了哪些对象?当遇到 MyBatis 初始化失败时,如何正确的找到分析问题的切入点?本文将针对这些问 ...

  9. 谈谈你对Spring Bean生命周期的理解【面试】

    前言 面试中经常会被问到Spring Bean的生命周期,有些人说记不住,看了一遍源码也是云里雾里的,那是因为只看理论,没有自己实践,如果自己亲自写代码验证一下,不管是对Spring的宏观感受,还是微 ...

最新文章

  1. 站长就是个太监^_^
  2. C++的enum hack
  3. 数据结构+算法+c++学习(写在前面)
  4. 使用虚拟环境 virtualenv
  5. Windows中的用户和组以及用户密码破解
  6. html符号中文含义大全特殊,中文标点符号大全名称
  7. golang httpServer对于keepAlive长连接的处理方式
  8. html 颜色渐变动画效果,js实现按钮颜色渐变动画效果
  9. 【Windows系统资源】​​​​​​​iexplore.exe命令行参数解释
  10. 静态手绘图-屁民科普
  11. vue图片懒加载插件vue-lazyload监听加载失败事件的解决方案
  12. 全新系列手机 配索尼4800万摄像头
  13. Docker监控远程服务器
  14. Linux上怎样安装gcc
  15. Nginx 搭建DASH服务器
  16. 未来两年前装激光雷达规模超150万颗,技术路线博弈下的市场
  17. 电商商城-商品模块数据库设计
  18. android面试资料
  19. 用Selenium + ChromeDriver 实现多屏滑动截取+拼接(有源码)
  20. linux 拍照的软件,六款优秀的Linux照片管理软件

热门文章

  1. 支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport
  2. wust2013届推免生复试机试代码
  3. how to become an expert in excel
  4. 如何快速完成整理笔记?
  5. U3D+SVN: 两份相同资源放在不同目录下导致META的更改
  6. Notification通知栏
  7. 世界首台!我国量子计算机超越早期经典计算机
  8. java基础:简单实现线程池
  9. 19道小米网运维工程师笔试真题
  10. Gradle笔记系列(一)