浅谈Spring中的注解@Scope("prototype")与@Scope("singleton") 区别
一,使用过Spring的朋友们都知道,在配置xml文件中注册一个spring实例化Bean通过需要以下配置,那么其中的scope这个属性到底表示什么意思呢?
<bean id="userVo" class="com.**.domain.UserVo" scope="singleton" init-method="init" destroy-
method="destory">
</bean>
1、singleton
当一个bean的作用域设置为singleton,那么Spring ioc容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与我们bean定义的相匹配,则只会返回该bean的同一实例。换言之,当把一个bean作用域设置为singleton作时,Spring ioc容器只会创建该bean定义的唯一实例,这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
(这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个Class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的ioc容器中只会存在一个该bean。)
2,prototype
当一个bean的作用域设置为prototype,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作。对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个作用域为prototype的bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
二,为什么要设计这2中作用域呢?这里总结了网友的结论归纳起来不外乎以下2条
1,用的地方相对少;
2,提高程序性能。
下面进行说明:1,只能说相对少,前台请求Action的情况需要prototype,Action不是线程安全的,要求在多线程环境下必须是一个线程对应一个独立的实例不能使用singleton。再比如如果你给你的Action中定义很多的属性,那么单例肯定会出现竞争访问的情况,如下:
@Controller
@RequestMapping("/")
@Scope("prototype")
public class TestController {
private static int a = 0; //静态
private int b = 0; //非静态
@RequestMapping("/test")
public void test() {
System.out.println(a + " | " + b);
打印结果:
单例 (singleton)
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
多例 (prototype)
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0
通过以上结果再次证明了singleton只有一个实例;prototype每次重新请求都会new一个新的实例。
三,spring中scope属性值还总结:
1,singleton: 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例;
2,prototype:与单例模式相反,表示为每一个bean请求都会提供一个实例;
3,request:在请求范围内会为每一个来自客户端的网络请求提供一个实例,在请求完成后,bean会失效并被垃圾回收器回收;
4,session:与请求范围类似,表示确保每个session中有个Bean的实例,在session过期后随之消失;
5,global-session:表示在全局会话内有效。
浅谈Spring中的注解@Scope("prototype")与@Scope("singleton")区别一,使用过Spring的朋友们都知道,在配置xml文件中注册一个spring实例化Bean通过需要以下配置,那么其中的scope这个属性到底表示什么意思呢? <bean id="userVo" class="com.**.domain.UserVo" scope="sing...
singleton:设定创建出的对象保存在spring容器中,是一个单例的对象(bean默认是单例)
单例的对象是在加载spring容器时就创建了,且此后你在同一个bean获取资源时,用getBean()方法得到的对象都是同一个地址值的对象
prototype:,设定创建出的对象保存在spring容器中,是一个非单例的对象
非单例的对象是在调用getBean()方法时才创建对象,在同一个bean获取的资源时,用getBean()方法得到的对象都不相同
request、session、application、websocket:设定创建出的对象放置在web容器对应的位置
三、bean的生命周期控制
用于控制方法的执行时机
名称: init-method, destroy-metho
3.7.1. 用BeanPostProcessor定制bean
3.7.1.1. 使用BeanPostProcessor的Hello World示例
3.7.1.2. RequiredAnnotationBeanPostProcessor示例
3.7.2. 用BeanFactoryPostProcessor定制配置元数据
3.7.2.1. PropertyPlaceholderConfigurer示例
3.7.2.2. PropertyOverrideConfigurer示例
3.7.3. 使用FactoryBean定制实例化逻辑
3.8. ApplicationContext
3.8.1. 利用MessageSource实现国际化
3.8.2. 事件
3.8.3. 底层资源的访问
3.8.4. ApplicationContext在WEB应用中的实例化
3.9. 粘合代码和可怕的singleton
3.9.1. 使用Singleton-helper类
4. 资源
4.1. 简介
4.2. Resource 接口
4.3. 内置 Resource 实现
4.3.1. UrlResource
4.3.2. ClassPathResource
4.3.3. FileSystemResource
4.3.4. ServletContextResource
4.3.5. InputStreamResource
4.3.6. ByteArrayResource
4.4. ResourceLoader
4.5. ResourceLoaderAware 接口
4.6. 把Resource作为属性来配置
4.7. Application context 和Resource 路径
4.7.1. 构造application context
4.7.1.1. 创建 ClassPathXmlApplicationContext 实例 - 简介
4.7.2. Application context构造器中资源路径的通配符
4.7.2.1. Ant风格的pattern
4.7.2.2. classpath*: 前缀
4.7.2.3. 其他关于通配符的说明
4.7.3. FileSystemResource 提示
5. 校验,数据绑定,BeanWrapper,与属性编辑器
5.1. 简介
5.2. 使用Spring的Validator接口进行校验
5.3. 从错误代码到错误信息
5.4. Bean处理和BeanWrapper
5.4.1. 设置和获取属性值以及嵌套属性
5.4.2. 内建的PropertyEditor实现
5.4.2.1. 注册用户自定义的PropertyEditor
6. 使用Spring进行面向切面编程(AOP)
6.1. 简介
6.1.1. AOP概念
6.1.2. Spring AOP的功能和目标
6.1.3. Spring的AOP代理
6.2. @AspectJ支持
6.2.1. 启用@AspectJ支持
6.2.2. 声明一个切面
6.2.3. 声明一个切入点(pointcut)
6.2.3.1. 切入点指定者的支持
6.2.3.2. 合并切入点表达式
6.2.3.3. 共享常见的切入点(pointcut)定义
6.2.3.4. 示例
6.2.4. 声明通知
6.2.4.1. 前置通知(Before advice)
6.2.4.2. 返回后通知(After returning advice)
6.2.4.3. 抛出后通知(After throwing advice)
6.2.4.4. 后通知(After (finally) advice)
6.2.4.5. 环绕通知(Around Advice)
6.2.4.6. 通知参数(Advice parameters)
6.2.4.7. 通知(Advice)顺序
6.2.5. 引入(Introductions)
6.2.6. 切面实例化模型
6.2.7. 例子
6.3. Schema-based AOP support
6.3.1. 声明一个切面
6.3.2. 声明一个切入点
6.3.3. 声明通知
6.3.3.1. 通知(Advice)
6.3.3.2. 返回后通知(After returning advice)
6.3.3.3. 抛出异常后通知(After throwing advice)
6.3.3.4. 后通知(After (finally) advice)
6.3.3.5. 通知
6.3.3.6. 通知参数
6.3.3.7. 通知顺序
6.3.4. 引入
6.3.5. 切面实例化模型
6.3.6. Advisors
6.3.7. 例子
6.4. AOP声明风格的选择
6.4.1. Spring AOP还是完全用AspectJ?
6.4.2. Spring AOP中使用@AspectJ还是XML?
6.5. 混合切面类型
6.6. 代理机制
6.7. 编程方式创建@AspectJ代理
6.8. 在Spring应用中使用AspectJ
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入
6.8.1.1. @Configurable object的单元测试
6.8.1.2. 多application context情况下的处理
6.8.2. Spring中其他的AspectJ切面
6.8.3. 使用Spring IoC来配置AspectJ的切面
6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW)
6.9. 其它资源
7. Spring AOP APIs
7.1. 简介
7.2. Spring中的切入点API
7.2.1. 概念
7.2.2. 切入点实施
7.2.3. AspectJ切入点表达式
7.2.4. 便利的切入点实现
7.2.4.1. 静态切入点
7.2.4.2. 动态切入点
7.2.5. 切入点的基类
7.2.6. 自定义切入点
7.3. Spring的通知API
7.3.1. 通知的生命周期
7.3.2. Spring里的通知类型
7.3.2.1. 拦截around通知
7.3.2.2. 前置通知
7.3.2.3. 异常通知
7.3.2.4. 后置通知
7.3.2.5. 引入通知
7.4. Spring里的advisor(Advisor) API
7.5. 使用ProxyFactoryBean创建AOP代理
7.5.1. 基础
7.5.2. JavaBean属性
7.5.3. 基于JDK和CGLIB的代理
7.5.4. 对接口进行代理
7.5.5. 对类进行代理
7.5.6. 使用“全局”advisor
7.6. 简化代理定义
7.7. 使用ProxyFactory通过编程创建AOP代理
7.8. 操作被通知对象
7.9. 使用“自动代理(autoproxy)”功能
7.9.1. 自动代理bean定义
7.9.1.1. BeanNameAutoProxyCreator
7.9.1.2. DefaultAdvisorAutoProxyCreator
7.9.1.3. AbstractAdvisorAutoProxyCreator
7.9.2. 使用元数据驱动的自动代理
7.10. 使用TargetSources
7.10.1. 热交换目标源
7.10.2. 池化目标源
7.10.3. 原型目标源
7.10.4. ThreadLocal目标源
7.11. 定义新的通知类型
7.12. 更多资源
8. 测试
8.1. 简介
8.2. 单元测试
8.3. 集成测试
8.3.1. Context管理和缓存
8.3.2. 测试fixture的依赖注入
8.3.3. 事务管理
8.3.4. 方便的变量
8.3.5. 示例
8.3.6. 运行集成测试
8.4. 更多资源
II. 中间层数据访问
9. 事务管理
9.1. 简介
9.2. 动机
9.3. 关键抽象
9.4. 使用资源同步的事务
9.4.1. 高层次方案
9.4.2. 低层次方案
9.4.3. TransactionAwareDataSourceProxy
9.5. 声明式事务管理
9.5.1. 理解Spring的声明式事务管理实现
9.5.2. 第一个例子
9.5.3. 回滚
9.5.4. 为不同的bean配置不同的事务语义
9.5.5. <tx:advice/> 有关的设置
9.5.6. 使用 @Transactional
9.5.6.1. @Transactional 有关的设置
9.5.7. 插入事务操作
9.5.8. 结合AspectJ使用 @Transactional
9.6. 编程式事务管理
9.6.1. 使用 TransactionTemplate
9.6.2. 使用 PlatformTransactionManager
9.7. 选择编程式事务管理还是声明式事务管理
9.8. 与特定应用服务器集成
9.8.1. BEA WebLogic
9.8.2. IBM WebSphere
9.9. 公共问题的解决方案
9.9.1. 对一个特定的 DataSource 使用错误的事务管理器
9.10. 更多的资源
10. DAO支持
10.1. 简介
10.2. 一致的异常层次
10.3. 一致的DAO支持抽象类
11. 使用JDBC进行数据访问
11.1. 简介
11.1.1. Spring JDBC包结构
11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理
11.2.1. JdbcTemplate类
11.2.2. NamedParameterJdbcTemplate类
11.2.3. SimpleJdbcTemplate类
11.2.4. DataSource接口
11.2.5. SQLExceptionTranslator接口
11.2.6. 执行SQL语句
11.2.7. 执行查询
11.2.8. 更新数据库
11.3. 控制数据库连接
11.3.1. DataSourceUtils类
11.3.2. SmartDataSource接口
11.3.3. AbstractDataSource类
11.3.4. SingleConnectionDataSource类
11.3.5. DriverManagerDataSource类
11.3.6. TransactionAwareDataSourceProxy类
11.3.7. DataSourceTransactionManager类
11.4. 用Java对象来表达JDBC操作
11.4.1. SqlQuery类
11.4.2. MappingSqlQuery类
11.4.3. SqlUpdate类
11.4.4. StoredProcedure类
11.4.5. SqlFunction类
12. 使用ORM工具进行数据访问
12.1. 简介
12.2. Hibernate
12.2.1. 资源管理
12.2.2. 在Spring的application context中创建 SessionFactory
12.2.3. HibernateTemplate
12.2.4. 不使用回调的基于Spring的DAO实现
12.2.5. 基于Hibernate3的原生API实现DAO
12.2.6. 编程式的事务划分
12.2.7. 声明式的事务划分
12.2.8. 事务管理策略
12.2.9. 容器资源 vs 本地资源
12.2.10. 在应用服务器中使用Hibernate的注意点
12.3. JDO
12.3.1. 建立PersistenceManagerFactory
12.3.2. JdoTemplate和JdoDaoSupport
12.3.3. 基于原生的JDO API实现DAO
12.3.4. 事务管理
12.3.5. JdoDialect
12.4. Oracle TopLink
12.4.1. SessionFactory 抽象层
12.4.2. TopLinkTemplate 和 TopLinkDaoSupport
12.4.3. 基于原生的TopLink API的DAO实现
12.4.4. 事务管理
12.5. iBATIS SQL Maps
12.5.1. iBATIS 1.x和2.x的概览与区别
12.5.2. iBATIS SQL Maps 1.x
12.5.2.1. 创建SqlMap
12.5.2.2. 使用 SqlMapTemplate 和 SqlMapDaoSupport
12.5.3. iBATIS SQL Maps 2.x
12.5.3.1. 创建SqlMapClient
12.5.3.2. 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport
12.5.3.3. 基于原生的iBATIS API的DAO实现
12.6. JPA
12.6.1. 在Spring环境中建立JPA
12.6.1.1. LocalEntityManagerFactoryBean
12.6.1.2. LocalContainerEntityManagerFactoryBean
12.6.1.3. 处理多个持久化单元
12.6.2. JpaTemplate 和 JpaDaoSupport
12.6.3. 基于原生的JPA实现DAO
12.6.4. 异常转化
12.6.5. 事务管理
12.6.6. JpaDialect
III. Web
13. Web框架
13.1. 介绍
13.1.1. 与其他web框架的集成
13.1.2. Spring Web MVC框架的特点
13.2. DispatcherServlet
13.3. 控制器
13.3.1. AbstractController 和 WebContentGenerator
13.3.2. 其它的简单控制器
13.3.3. MultiActionController
13.3.4. 命令控制器
13.4. 处理器映射(handler mapping)
13.4.1. BeanNameUrlHandlerMapping
13.4.2. SimpleUrlHandlerMapping
13.4.3. 拦截器(HandlerInterceptor)
13.5. 视图与视图解析
13.5.1. 视图解析器
13.5.2. 视图解析链
13.5.3. 重定向(Rediret)到另一个视图
13.5.3.1. RedirectView
13.5.3.2. redirect:前缀
13.5.3.3. forward:前缀
13.6. 本地化解析器
13.6.1. AcceptHeaderLocaleResolver
13.6.2. CookieLocaleResolver
13.6.3. SessionLocaleResolver
13.6.4. LocaleChangeInterceptor
13.7. 使用主题
13.7.1. 简介
13.7.2. 如何定义主题
13.7.3. 主题解析器
13.8. Spring对分段文件上传(multipart file upload)的支持
13.8.1. 介绍
13.8.2. 使用MultipartResolver
13.8.3. 在表单中处理分段文件上传
13.9. 使用Spring的表单标签库
13.9.1. 配置标签库
13.9.2. form标签
13.9.3. input标签
13.9.4. checkbox标签
13.9.5. radiobutton标签
13.9.6. password标签
13.9.7. select标签
13.9.8. option标签
13.9.9. options标签
13.9.10. textarea标签
13.9.11. hidden标签
13.9.12. errors标签
13.10. 处理异常
13.11. 惯例优先原则(convention over configuration)
13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping
13.11.2. 对模型的支持:ModelMap (ModelAndView)
13.11.3. 对视图的支持: RequestToViewNameTranslator
13.12. 其它资源
14. 集成视图技术
14.1. 简介
14.2. JSP和JSTL
14.2.1. 视图解析器
14.2.2. 'Plain-old' JSPs versus JSTL 'Plain-old' JSP与JSTL
14.2.3. 帮助简化开发的额外的标签
14.3. Tiles
14.3.1. 需要的资源
14.3.2. 如何集成Tiles
14.3.2.1. InternalResourceViewResolver
14.3.2.2. ResourceBundleViewResolver
14.4. Velocity和FreeMarker
14.4.1. 需要的资源
14.4.2. Context 配置
14.4.3. 创建模板
14.4.4. 高级配置
14.4.4.1. velocity.properties
14.4.4.2. FreeMarker
14.4.5. 绑定支持和表单处理
14.4.5.1. 用于绑定的宏
14.4.5.2. 简单绑定
14.4.5.3. 表单输入生成宏
14.4.5.4. 重载HTML转码行为并使你的标签符合XHTML
14.5. XSLT
14.5.1. 写在段首
14.5.1.1. Bean 定义
14.5.1.2. 标准MVC控制器代码
14.5.1.3. 把模型数据转化为XML
14.5.1.4. 定义视图属性
14.5.1.5. 文档转换
14.5.2. 小结
14.6. 文档视图(PDF/Excel)
14.6.1. 简介
14.6.2. 配置和安装
14.6.2.1. 文档视图定义
14.6.2.2. Controller 代码
14.6.2.3. Excel视图子类
14.6.2.4. PDF视图子类
14.7. JasperReports
14.7.1. 依赖的资源
14.7.2. 配置
14.7.2.1. 配置ViewResolver
14.7.2.2. 配置View
14.7.2.3. 关于报表文件
14.7.2.4. 使用 JasperReportsMultiFormatView
14.7.3. 构造ModelAndView
14.7.4. 使用子报表
14.7.4.1. 配置子报表文件
14.7.4.2. 配置子报表数据源
14.7.5. 配置Exporter的参数
15. 集成其它Web框架
15.1. 简介
15.2. 通用配置
15.3. JavaServer Faces
15.3.1. DelegatingVariableResolver
15.3.2. FacesContextUtils
15.4. Struts
15.4.1. ContextLoaderPlugin
15.4.1.1. DelegatingRequestProcessor
15.4.1.2. DelegatingActionProxy
15.4.2. ActionSupport 类
15.5. Tapestry
15.5.1. 注入 Spring 托管的 beans
15.5.1.1. 将 Spring Beans 注入到 Tapestry 页面中
15.5.1.2. 组件定义文件
15.5.1.3. 添加抽象访问方法
15.5.1.4. 将 Spring Beans 注入到 Tapestry 页面中 - Tapestry 4.0+ 风格
15.6. WebWork
15.7. 更多资源
16. Portlet MVC框架
16.1. 介绍
16.1.1. 控制器 - MVC中的C
16.1.2. 视图 - MVC中的V
16.1.3. Web作用范围的Bean
16.2. DispatcherPortlet
16.3. ViewRendererServlet
16.4. 控制器
16.4.1. AbstractController和PortletContentGenerator
16.4.2. 其它简单的控制器
16.4.3. Command控制器
16.4.4. PortletWrappingController
16.5. 处理器映射
16.5.1. PortletModeHandlerMapping
16.5.2. ParameterHandlerMapping
16.5.3. PortletModeParameterHandlerMapping
16.5.4. 增加 HandlerInterceptor
16.5.5. HandlerInterceptorAdapter
16.5.6. ParameterMappingInterceptor
16.6. 视图和它们的解析
16.7. Multipart文件上传支持
16.7.1. 使用PortletMultipartResolver
16.7.2. 处理表单里的文件上传
16.8. 异常处理
16.9. Portlet应用的部署
IV. 整合
17. 使用Spring进行远程访问与Web服务
17.1. 简介
17.2. 使用RMI暴露服务
17.2.1. 使用 RmiServiceExporter 暴露服务
17.2.2. 在客户端链接服务
17.3. 使用Hessian或者Burlap通过HTTP远程调用服务
17.3.1. 为Hessian配置DispatcherServlet
17.3.2. 使用HessianServiceExporter暴露你的bean
17.3.3. 客户端连接服务
17.3.4. 使用Burlap
17.3.5. 对通过Hessian或Burlap暴露的服务使用HTTP基础认证
17.4. 使用HTTP调用器暴露服务
17.4.1. 暴露服务对象
17.4.2. 在客户端连接服务
17.5. Web服务
17.5.1. 使用JAXI-RPC暴露服务
17.5.2. 访问Web服务
17.5.3. 注册bean映射
17.5.4. 注册自己的处理方法
17.5.5. 使用XFire来暴露Web服务
17.6. 对远程接口不提供自动探测
17.7. 在选择这些技术时的一些考虑
18. Enterprise Java Bean(EJB)集成
18.1. 简介
18.2. 访问EJB
18.2.1. 概念
18.2.2. 访问本地的无状态Session Bean(SLSB)
18.2.3. 访问远程SLSB
18.3. 使用Spring提供的辅助类实现EJB组件
19. JMS
19.1. 简介
19.2. 使用Spring JMS
19.2.1. JmsTemplate
19.2.2. 连接工厂
19.2.3. (消息)目的地管理
19.2.4. 消息侦听容器
19.2.4.1. SimpleMessageListenerContainer
19.2.4.2. DefaultMessageListenerContainer
19.2.4.3. ServerSessionMessageListenerContainer
19.2.5. 事务管理
19.3. 发送一条消息
19.3.1. 使用消息转换器
19.3.2. SessionCallback 和ProducerCallback
19.4. 接收消息
19.4.1. 同步接收
19.4.2. 异步接收 - 消息驱动的POJOs
19.4.3. SessionAwareMessageListener 接口
19.4.4. MessageListenerAdapter
19.4.5. 事务中的多方参与
20. JMX
20.1. 介绍
20.2. 输出bean到JMX
20.2.1. 创建一个MBeanServer
20.2.2. 复用现有的MBeanServer
20.2.3. MBean的惰性初始化
20.2.4. MBean的自动注册
20.2.5. 控制注册行为
20.3. 控制bean的管理接口
20.3.1. MBeanInfoAssembler 接口
20.3.2. 使用源码级元数据
20.3.3. 使用JDK 5.0注解
20.3.4. 源代码级的元数据类型
20.3.5. 接口AutodetectCapableMBeanInfoAssembler
20.3.6. 用Java接口定义管理接口
20.3.7. 使用MethodNameBasedMBeanInfoAssembler
20.4. 控制bean的 ObjectName
20.4.1. 从Properties中读取ObjectName
20.4.2. 使用 MetadataNamingStrategy
20.5. JSR-160连接器
20.5.1. 服务器端连接器
20.5.2. 客户端连接器
20.5.3. 基于Burlap/Hessian/SOAP的JMX
20.6. 通过代理访问MBeans
20.7. 通知
20.7.1. 为通知注册监听器
20.7.2. 发布通知
20.8. 更多资源
21. JCA CCI
21.1. 介绍
21.2. 配置CCI
21.2.1. 连接器配置
21.2.2. 在Spring中配置ConnectionFactory
21.2.3. 配置CCI连接
21.2.4. 使用一个 CCI 单连接
21.3. 使用Spring的 CCI访问支持
21.3.1. 记录转换
21.3.2. CciTemplate 类
21.3.3. DAO支持
21.3.4. 自动输出记录生成
21.3.5. 总结
21.3.6. 直接使用一个 CCI Connection 接口和Interaction接口
21.3.7. CciTemplate 使用示例
21.4. 建模CCI访问为操作对象
21.4.1. MappingRecordOperation
21.4.2. MappingCommAreaOperation
21.4.3. 自动输出记录生成
21.4.4. 总结
21.4.5. MappingRecordOperation 使用示例
21.4.6. MappingCommAreaOperation 使用示例
21.5. 事务
22. Spring邮件抽象层
22.1. 简介
22.2. Spring邮件抽象结构
22.3. 使用Spring邮件抽象
22.3.1. 可插拔的MailSender实现
22.4. 使用 JavaMail MimeMessageHelper
22.4.1. 创建一条简单的MimeMessage,并且发送出去
22.4.2. 发送附件和嵌入式资源(inline resources)
23. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
23.1. 简介
23.2. 使用OpenSymphony Quartz 调度器
23.2.1. 使用JobDetailBean
23.2.2. 使用 MethodInvokingJobDetailFactoryBean
23.2.3. 使用triggers和SchedulerFactoryBean来包装任务
23.3. 使用JDK Timer支持类
23.3.1. 创建定制的timers
23.3.2. 使用 MethodInvokingTimerTaskFactoryBean类
23.3.3. 打包:使用TimerFactoryBean来设置任务
23.4. SpringTaskExecutor抽象
23.4.1. TaskExecutor接口
23.4.2. 何时使用TaskExecutor接口
23.4.3. TaskExecutor类型
23.4.4. 使用TaskExecutor接口
24. 动态语言支持
24.1. 介绍
24.2. 第一个例子
24.3. 定义动态语言支持的bean
24.3.1. 公共概念
24.3.1.1. <lang:language/> 元素
24.3.1.2. Refreshable bean
24.3.1.3. 内置动态语言源文件
24.3.1.4. 理解dynamic-language-backed bean context的构造器注入
24.3.2. JRuby beans
24.3.3. Groovy beans
24.3.4. BeanShell beans
24.4. 场景
24.4.1. Spring MVC控制器脚本化
24.4.2. Validator脚本化
24.5. 更多的资源
25. 注解和源代码级的元数据支持
25.1. 简介
25.2. Spring的元数据支持
25.3. 注解
25.3.1. @Required
25.3.2. Spring中的其它@Annotations
25.4. 集成Jakarta Commons Attributes
25.5. 元数据和Spring AOP自动代理
25.5.1. 基本原理
25.5.2. 声明式事务管理
25.5.3. 缓冲
25.5.4. 自定义元数据
25.6. 使用属性来减少MVC web层配置
25.7. 元数据属性的其它用法
25.8. 增加对额外元数据API的支持
A. XML Schema-based configuration
A.1. Introduction
A.2. XML Schema-based configuration
A.2.1. Referencing the schemas
A.2.2. The util schema
A.2.2.1. <util:constant/>
A.2.2.2. <util:property-path/>
A.2.2.3. <util:properties/>
A.2.2.4. <util:list/>
A.2.2.5. <util:map/>
A.2.2.6. <util:set/>
A.2.3. The jee schema
A.2.3.1. <jee:jndi-lookup/> (simple)
A.2.3.2. <jee:jndi-lookup/> (with single JNDI environment setting)
A.2.3.3. <jee:jndi-lookup/> (with multiple JNDI environment settings)
A.2.3.4. <jee:jndi-lookup/> (complex)
A.2.3.5. <jee:local-slsb/> (simple)
A.2.3.6. <jee:local-slsb/> (complex)
A.2.3.7. <jee:remote-slsb/>
A.2.4. The lang schema
A.2.5. The tx (transaction) schema
A.2.6. The aop schema
A.2.7. The tool schema
A.2.8. The beans schema
A.3. Setting up your IDE
A.3.1. Setting up Eclipse
A.3.2. Setting up IntelliJ IDEA
A.3.3. Integration issues
A.3.3.1. XML parsing errors in the Resin v.3 application server
B. Extensible XML authoring
B.1. Introduction
B.2. Authoring the schema
B.3. Coding a NamespaceHandler
B.4. Coding a BeanDefinitionParser
B.5. Registering the handler and the schema
B.5.1. META-INF/spring.handlers
B.5.2. META-INF/spring.schemas
C. spring-beans-2.0.dtd
D. spring.tld
D.1. Introduction
D.2. The bind tag
D.3. The escapeBody tag
D.4. The hasBindErrors tag
D.5. The htmlEscape tag
D.6. The message tag
D.7. The nestedPath tag
D.8. The theme tag
D.9. The transform tag
E. spring-form.tld
E.1. Introduction
E.2. The checkbox tag
E.3. The errors tag
E.4. The form tag
E.5. The hidden tag
E.6. The input tag
E.7. The label tag
E.8. The option tag
E.9. The options tag
E.10. The password tag
E.11. The radiobutton tag
E.12. The select tag
E.13. The textarea tag
F. Spring 2.0 开发手册中文化项目
F.1. 声明
F.2. 致谢
F.3. 参与人员及任务分配
F.4. Spring 2.0 正式版开发手册翻译说明
F.5. 项目历程
F.5.1. Spring 2.0 RC2 开发手册翻译项目
F.5.2. Spring 2.0 正式版开发手册翻译项目
本文目录1.@Scope注解是什么2.@Scope注解怎么使用3.singleton/prototype模式演示3.1 singleton单例演示3.2 prototype多例演示4.恶汉/懒汉4.1 singleton 恶汉 演示4.2 prototype 懒汉 演示5.Bean实例对象的销毁6.@Scope注解的使用场景
1.@Scope注解是什么
@Scope注解是 Spring IOC 容器中的一个作用域,在 Spring IOC 容器中,他用来配置Bean实例的作用域对象。@Scope 具有
当我们在一个ACTION类里面写很多个方法的时候(其实是一种按功能划分模块编程的思想),每个方法的返回状态可能不一样,
如果ACTION中不@Scope("prototype"),有可能报找不到XXXACTION的错误!写上这个就表示每次请求都重新创建一个ACTION,
与SINGALON对应,俗称“多例”(也叫原型)。
单例就是之创建一个实例,所以多用户操作的时候,会线程不安全,如果加
@Lazy @Scope
* 1.使用scope来控制bean的作用范围,SCOPE_SINGLETON创建一个bean,SCOPE_PROTOTYPE表示创建多个bean实例对象
* 2.返回值等同于配置文件中的Class,方法名等同于id(xml)
* 3.懒加载在获取容器中对象的时候创建对象,默认是在ioc容器创建的时候创建对象
* @return
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
@Lazy
@Bean(v
前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton。
看到这个题目后,第一个想法是用Scott Meyer在《Effective C++》中提到的,在static成员函数中构造local static变量的方法来实现,但是经过一番查找、思考,才明白这种实现在某些情况下是有问题的。本文主要将从基本的单线程中的Singleton开始,慢慢讲述多线程与Singleton的那些事。
在单线程下,下面这个是常见的写法:
template<typename>
class Singleton
Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。
第一章 序言
第二章 简介
2.1.概述
2.2.背景
2.3.模块
2.4.许可证信息
2.5.支持
第三章 背景
3.1.控制反转
第一部分 核心技术
第四章 对象、对象工厂和应用程序上下文
4.1.简介
4.2.IObjectFactory,IApplicationContext和IObjectDefinition接口介绍
4.2.1.The IObjectFactory和IApplicationContext
4.2.2.对象定义
4.2.3.对象的创建
4.2.3.1.通过构造器创建对象
4.2.3.2.通过静态工厂方法创建对象
4.2.3.3.通过实例工厂方法创建对象
4.2.4.泛型类的对象创建
4.2.4.1.通过构造器创建泛型类的对象
4.2.4.2.通过静态工厂方法创建泛型类的对象
4.2.4.3.通过实例工厂方法创建泛型类的对象
4.2.5.对象标识符(id和name)
4.2.6.Singleton和Prototype
4.3.属性,协作对象,自动装配和依赖检查
4.3.1.设置对象的属性和协作对象
4.3.2.构造器参数解析
4.3.2.1.根据参数类型匹配构造器参数
4.3.2.2.根据参数索引匹配构造器参数
4.3.2.3.根据名称匹配构造器参数
4.3.3.详细讨论对象属性和构造器参数
4.3.3.1.设置空值
4.3.3.2.设置集合值
4.3.3.3.设置泛型集合的值
4.3.3.4.设置索引器属性
4.3.3.5.内联对象定义
4.3.3.6.idref节点
4.3.3.7.引用协作对象
4.3.3.8.value和ref节点的简短格式
4.3.3.9.复合属性名
4.3.4.方法注入
4.3.4.1.查询方法注入
4.3.4.2.替换任意方法
4.3.5.引用其他对象或类型的成员
4.3.5.1.使用对象或类的属性值进行注入
4.3.5.2.使用字段值进行注入
4.3.5.3.使用方法的返回值进行注入
4.3.6.IFactoryObject接口的其它实现
4.3.6.1.Log4Net
4.3.7.使用depends-on
4.3.8.自动装配协作对象
4.3.9.检查依赖项
4.4.类型转换
4.4.1.枚举类型的转换
4.4.2.内置的类型转换器
4.4.3.自定义类型转换器
4.4.3.1.使用CustomConverterConfigurer类
4.5.自定义对象的行为
4.5.生命周期接口
4.5.1.1.IInitializingObject接口和init-method属性
4.5.1.2.IDisposable接口和destroy-method属性
4.5.2.让对象了解自己的容器
4.5.2.1.IObjectFactoryAware接口
4.5.2.2.IObjectNameAware接口
4.5.3.IFactoryObject接口
4.6.抽象与子对象定义
4.7.与IObjectFactory接口交互
4.7.1.获得IFactoryObject对象本身,而非其产品
4.8.使用IObjectPostProcessor接口自定义对象
4.9.使用IObjectFactoryPostProcessor定制对象工厂
4.9.1.PropertyPlaceholderConfigurer类
4.9.1.1.使用环境变量进行替换
4.9.2.PropertyOverrideConfigurer类
4.10.使用alias节点为对象添加别名
4.11.IApplicationContext简介
4.12.配置应用程序上下文
4.12.1.注册自定义解析器
4.12.2.创建自定义资源处理器
4.12.3.配置类型别名
4.12.4.注册类型转换器
4.13.IApplicationContext接口的扩展功能
4.13.1.上下文继承
4.13.2.使用IMessageSource接口
4.13.3.在Spring.NET内部使用资源
4.13.4.松耦合事件模型
4.13.5.IApplicationContext的事件通知
4.14.定制IApplicationContex中对象的行为
4.14.1.IApplicationContextAware标识接口
4.14.2.IObjectPostProcessor接口
4.14.3.IObjectFactoryPostProcessor接口
4.14.4.PropertyPlaceholderConfigurer类
4.15.从其它文件中导入对象定义
4.16.服务定位器访问
第五章. IObjectWrapper接口和类型转换
5.1.简介
5.2.使用IObjectWrapper接口管理对象
5.2.1.读、写普通及嵌套的属性
5.2.2.其它功能
5.3.类型转换
5.3.1.转换枚举类型
5.4.内置类型转换器
第六章. IResource接口
6.1.简介
6.2.IResource接口
6.3.内置的IResource实现类
6.4.IResourceLoader接口
6.5.IResourceLoaderAware接口
6.6.应用程序上下文和IResource路径
第七章. 多线程和并发操作
7.1.简介
7.2.线程本地存储
7.3.同步基础
7.3.1.ISync
7.3.2.SyncHolder
7.3.3.Latch
7.3.4.Semaphore
第八章. 对象池
8.1.简介
8.2.接口和实现
第九章. Spring.NET杂记
9.1.简介
9.2.PathMatcher
9.2.1.通用规则
9.2.2.匹配文件名
9.2.3.匹配子目录
9.2.4.大小写需要考虑,斜线可以任意
第十章. 表达式求值
10.1.简介
10.2.表达式求值
10.3.语言参考
10.3.1.文字表达式
10.3.2.属性,数组,列表,字典,索引器
10.3.2.1.定义内联的数组、列表和词典
10.3.3.方法
10.3.4.操作符
10.3.4.1.关系操作符
10.3.4.2.逻辑操作符
10.3.4.3.算术运算符
10.3.5.赋值
10.3.6.表达式列表
10.3.7.类型
10.3.8.类型注册
10.3.9.构造器
10.3.10.变量
10.3.10.1.'#this'和'#root'变量
10.3.11.三元操作符(If-Then-Else)
10.3.12.列表的投影(Projection)和选择(Selection)
10.3.13. 集合处理器和聚合器
10.3.13.1.Count聚合器
10.3.13.2.Sum聚合器
10.3.13.3.Average聚合器
10.3.13.4.Minimum聚合器
10.3.13.5.Maximum聚合器
10.3.13.6.nonNull处理器
10.3.13.7.distinct处理器
10.3.13.8.sort处理器
10.3.14.引用容器中的对象
10.3.15.Lambda表达式
10.3.16.空目标
10.4.本章使用的示例类型
第十一章. 验证框架
11.1.简介
11.2.用法示例
11.3.验证对象组
11.4.验证对象
11.4.1.条件验证对象
11.4.2.必需性验证对象
11.4.3.正则表达式验证对象
11.4.4.通用验证对象
11.4.5.条件型验证
11.5.验证行为
11.5.1.错误消息行为
11.5.2.通用行为
11.6.引用验证对象
11.7.在ASP.NET中的使用技巧
11.7.1.显示验证错误
11.7.1.1.配置错误显示类
第十二章. 使用Spring.NET进行面向方面的编程
12.1.简介
12.1.1.AOP基本概念
12.1.2.Spring.NET AOP的功能
12.1.3.Spring.NET的AOP代理
12.2.Spring.NET中的切入点
12.2.1.概念
12.2.2.切入点的操作
12.2.3.Spring.NET提供的切入点实现类
12.2.3.1.静态切入点
12.2.3.2.动态切入点
12.2.4.自定义切入点
12.3.Spring.NET的通知类型
12.3.1.通知的生命周期
12.3.2.通知类型
12.3.2.1.拦截环绕通知
12.3.2.2.前置通知
12.3.2.3.异常通知
12.3.2.4.后置通知
12.3.2.5.引入通知
12.4.Spring.NET中的Advisor
12.5.使用ProxyFactoryObject创建AOP代理
12.5.1.基本原理
12.5.2.ProxyFactoryObject的属性
12.5.3.代理接口
12.5.4.代理一个类
12.6.使用ProxyFactory类以编程方式创建AOP代理
12.7.管理目标对象
12.8.使用“自动代理”功能
12.8.1.自动代理对象的定义
12.8.1.1.ObjectNameAutoProxyCreator
12.8.1.2.DefaultAdvisorAutoProxyCreator
12.8.1.3.AbstractAutoProxyCreator
12.8.2.使用特性驱动的自动代理
12.9.使用TargetSources
12.9.1.动态切换TargetSource
12.9.2.池化TargetSource
12.9.3.PrototypeTargetSource
12.10.定义新的通知类型
12.11.参考资源
第十三章.通用日志抽象层
13.1.简介
13.1.1.Logging API
13.2.实现与配置
13.2.1.控制台Logger
13.3.Log4Net
第二部分. 中间层数据访问
第十四章. 事务管理
14.1.简介
14.2.动机
14.3.核心接口
14.4.用事务进行资源同步
14.4.1.高层次方法
14.4.2.低层次方法
14.5.声明式事务管理
14.5.1.理解Spring.NET声明式事务管理的实现
14.5.2.第一个例子
14.5.3.Transaction特性的设置
14.5.4.通过AutoProxyCreator使用声明式事务
14.5.5.通过TransactionProxyFactoryObject使用声明式事务
14.5.6. 通过ProxyFactoryObject使用声明式事务
14.5.7. Using Abstract object definitions
14.5.8. Declarative Transactions using ProxyFactoryObject
14.6. 编程方式的事务管理
14.6.1.使用TransactionTemplate
14.6.2.使用IPlatformTransactionManager
14.7.选择编程方式还是声明方式
第十五章. 数据访问对象
15.1.简介
15.2.统一的异常体系
15.3.为数据访问对象提供的统一抽象基类
第十六章. DbProvider
16.1.简介
16.1.1.IDbProvider和DbProviderFactory
16.1.2. XML配置
16.1.3.管理连接字符串
第十七章. 使用ADO.NET进行数据访问
17.1.简介
17.2.动机
17.3.Provider抽象
17.3.1.创建IDbProvider类型的实例
17.4.命名空间
17.5.数据访问的方式
17.6.AdoTemplate简介
17.6.1.执行回调
17.6.2.在.NET 2.0中执行回调
17.6.3. .NET 1.1
17.6.4.AdoTemplate方法指南
17.7.异常翻译
17.8.参数管理
17.8.1. IDbParametersBuilder
17.8.2. IDbParameters
17.9. Mapping DBNull values
17.10. Basic data access operations
17.10.1. ExecuteNonQuery
17.10.2. ExecuteScalar
17.11. Queries and Lightweight Object Mapping
17.11.1. ResultSetExtractor
17.11.2. RowCallback
17.11.3. RowMapper
17.11.4. Query for a single object
17.11.5. Query using a CommandCreator
17.12. DataTable and DataSet
17.12.1. DataTables
17.12.2. DataSets
17.13. Deriving Stored Procedure Parameters
17.14. Database operations as Objects
17.14.1. AdoNonQuery
17.14.2. AdoQuery
17.14.3. MappingAdoQuery
17.14.4. Stored Procedure
17.14.5. DataSetOperation
18. ORM集成
18.1. 简介
第三部分. Web框架
第十九章. Web框架
19.1.简介
19.2.自动装载应用程序上下文和应用程序上下文嵌套
19.2.1. 配置
19.2.2.上下文嵌套
19.3.为ASP.NET页面进行依赖注入
19.3.1.为Web控件进行依赖注入
19.4.Master Page
19.4.1.将子页面与Master Page关联
19.5.双向数据绑定
19.5.1.数据绑定的后台实现
19.5.1.1.绑定方向
19.5.1.2.Formatters
19.5.1.3.类型转换
19.5.1.4.数据绑定事件
19.6.本地化
19.6.1.使用Localizer进行自动本地化(“推”模型)
19.6.2.使用Localizer
19.6.3.手动应用资源(“拉”模型的本地化)
19.6.4.在Web应用程序中进行图像本地化
19.6.5.全局资源
19.6.6.用户语言文化管理
19.6.6.1. DefaultWebCultureResolver
19.6.6.2. RequestCultureResolver
19.6.6.3. SessionCultureResolver
19.6.6.4. CookieCultureResolver
19.6.7.更改语言文化
19.7.结果映射
19.8.客户端脚本
19.8.1.在HTML的head节点内注册客户端脚本
19.8.2.向节点中添加CSS定义
19.8.3.全局目录(Well-Known Directories)
第四部分. 服务
第二十章. .NET Remoting
20.1.简介
20.2.在服务端发布SAO
20.2.1.SAO Singleton
20.2.2.SAO SingleCall
20.2.3.IIS应用程序配置
20.3.在客户端访问SAO
20.4.CAO 最佳实践
20.5.在服务端注册CAO
20.5.1.向CAO对象应用AOP通知
20.6.在客户端访问CAO
20.6.1.向客户端的CAO对象应用AOP通知
20.7. XML Schema for configuration
20.8.参考资源
第二十一章. .NET企业服务
21.1.简介
21.2.服务组件
21.3.服务端
21.4.客户端
第二十二章. Web服务
22.1.服务端
22.1.1.消除对.asmx文件的依赖
22.1.2.向web服务中注入依赖项
22.1.3.将PONO发布为web服务
22.1.4.将AOP代理发布为web服务
22.1.5.客户端的问题
22.2.客户端
22.2.1.WebServiceProxyFactory
22.2.2.WebServiceClientFactory
第二十三章. Windows后台服务
23.1.备注
23.2.简介
23.3.Spring.Services.WindowsService.Process.exe应用程序
23.3.1.安装
23.3.2.配置
23.4.将应用程序上下文发布为Windows服务
23.4.1.service.config
23.4.1.1.让应用程序了解自身的位置
23.4.2.watcher.xml - 可选的配置
23.4.3.bin目录 - 可选
23.5.自定义或扩展
23.5.1. .config文件
第五部分. 与Visual Studio.NET集成
第二十四章. 与Visual Studio.NET集成
24.1.XML编辑与验证
24.2.XML Schema的版本
24.3.集成API文档
第六部分. 快速入门程序
第二十五章. IoC快速入门
25.1.简介
25.2.Movie Finder
25.2.1.开始建立MovieFinder应用程序
25.2.2.第一个对象定义
25.2.3.属性注入
25.2.4.构造器参数注入
25.2.5.总结
25.2.6.日志
25.3.应用程序上下文和IMessageSource接口
25.3.1.简介
25.4.应用程序上下文和IEventRegistry接口
25.4.1.简介
25.5.对象池示例
25.5.1.实现Spring.Pool.IPoolableObjectFactory
25.5.2.使用池中的对象
25.5.3.利用executor执行并行的grep
25.6.AOP
第二十六章. AOP指南
26.1.简介
26.2.基础知识
26.2.1.应用通知
26.2.2.使用切入点-基本概念
26.3.深入探讨
26.3.1.其它类型的通知
26.3.1.1.前置通知
26.3.1.2.后置通知
26.3.1.3.异常通知
26.3.1.4.引入(mixins)
26.3.1.5.通知链
26.3.1.6.配置通知
26.3.2.使用特性定义切入点
26.4.The Spring.NET AOP Cookbook
26.4.1.缓存
26.4.2.性能监视
26.4.3.重试规则
Spring.NET AOP最佳实践
第二十七章. .NET Remoting快速入门
27.1.简介
27.2.Remoting实例程序
27.3.实现
27.4.运行程序
27.5.Remoting Schema
27.6.参考资源
第二十八章. Web框架快速入门
28.1.简介
第二十九章. SpringAir - 参考程序
29.1.简介
29.2.架构
29.3.实现
29.3.1.业务层
29.3.2.服务层
29.3.3.Web层
29.4.总结
第三十章. 数据访问快速入门
30.1.简介
第三十一章. 事务管理快速入门
31.1.简介
31.2.应用程序概述
31.2.1.接口
第七部分. Java开发人员必读
第三十二章. Java开发人员必读
32.1.简介
32.2.Beans和Objects
32.3.PropertyEditor和TypeConverter
32.4.ResourceBundle和ResourceManager
32.5.异常
32.6.应用程序配置
32.7.AOP框架
spring中bean的scope属性, 有如下5种类型:
singleton 表示在spring容器中的单例, 通过spring容器获得该bean时总是返回唯一的实例
prototype 表示每次获得bean都会生成一个新的对象
request 表示在一次http请求内有效(只适用于web应用)
session 表示在一个用户会话内有效(只适用于web应用)
globalSe...
总结一下 createScopedProxy() 方法把原始的 BeanDefinition 的 **autowireCandidate 属性修改成了 false**,因为改了这个值,所以在 @Autowired 属性注入的时候,就不会考虑到这个原生的 BeanDefinition 定义了
这里自己给造了一份新的这个 bean 的 BeanDefinition,可以理解为这个 bean 的代理 BeanDefinition,此时容器中已经存在两份 bean 的 BeanDefinition,只是原生的 .
在JavaScript中,prototype对象是实现面向对象的一个重要机制。
每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。
在通过new创建一个类的实例对象的时候,prototype对象的成员都成为实例化对象的成员
@Scope注解用于指定Spring容器中bean的作用域,即bean的生命周期。常用的作用域有:
1. singleton:单例模式,每个Spring容器中只有一个实例。
2. prototype:原型模式,每次请求都会创建一个新的实例。
3. request:每次HTTP请求都会创建一个新的实例。
4. session:每个HTTP会话都会创建一个新的实例。
5. global session:全局HTTP会话,一般用于基于portlet的Web应用。
使用@Scope注解可以在bean定义时指定作用域,例如:
@Component
@Scope("prototype")
public class MyBean {
// ...
这样定义的MyBean就是一个原型模式的bean,每次请求都会创建一个新的实例。