zoukankan      html  css  js  c++  java
  • Spring核心-IOC-AOP-模版

    1. POM-

    1.1 中央仓库

    1.2 各包作用

    spring-core.jar 	核心工具类
    spring-beans.jar 	是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行IoC/DI操作相关的所有类。
    spring-context-support.jar  spring容器上下文,包含加载xml的 ClassPathXmlApplicationContext
    spring-aop.jar 使用基于AOP 的Spring特性,如声明型事务管理(Declarative Transaction Management)
    spring-dao.jar 	Spring DAO、Spring Transaction 进行数据访问的所有类。
    spring-jdbc.jar Spring 对JDBC 数据访问进行封装的所有类。 
    spring-support.jar 包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。 
    
    spring-web.jar Web开发时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。 
    spring-webmvc.jar  Spring MVC 框架相关的所有类。包括框架的Servlets,Web MVC框架,控制器和视图支持。
    
    spring-remoting.jar 	支持EJB、远程调用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的类。 
    spring-jmx.jar 	这个jar包提供了对JMX 1.0/1.2的支持类。 
    
    spring-jms.jar 对JMS 1.0.2/1.1的支持类。 
    spring-jca.jar 对JCA 1.0的支持。 
    
    spring-jdo.jar 对JDO 1.0/2.0的支持。 
    spring-jpa.jar 对JPA 1.0的支持。 
    spring-toplink.jar 对TopLink框架的支持。 
    spring-ibatis.jar 对iBATIS SQL Maps的支持。 
    
    Spring-test.jar	 Spring自带的测试套件,包含SpringJUnit4ClassRunner等
    spring-mock.jar  Spring 测试套件使用了其中大量mock 类,这样测试就更加简单。模拟HttpServletRequest 和HttpServletResponse 类在Web 应用单元测试是很方便的。并且提供了对JUnit的支持。 
    

    2. 装配Bean

    2.0 高级装配技巧

    2.0.1 Bean作用域@Scope-默认Singleton

    //标注在@Component上
    单例(Singleton)	 @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)	
    原型(Prototype)	@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)	每次从spring上下文创建一个新的实例
    会话(Session)	@Scope(WebApplicationContext#SCOPE_REQUEST)	 web应用时每个会话创建新的
    请求(Request)	@Scope(WebApplicationContext#SCOPE_SESSION)  web应用时每个请求创建
    
    //使用xml标注
    

    2.0.2 条件化bean-满足条件才注入

    //其中 MagicExistCondition implements interface Condition, matches方法返回true时才加载
    @Component
    @Conditional(MagicExistCondition.class)
    public class SgtPepers implements CompactDisc {}
    

    2.0.3 @Profile 按开发/发布状态加载不同bean

    a). 可标注在Class和method上, 可选值 dev / prod
    b). 取值依赖两个独立的属性,spring.profiles.active/spring.profiles.default 的值,都空时不会加标注了@Profile的地方
    c). 设置两个属性: 作为DispatchServlet的初始化参数、作为Web应用的上下文参数、JNDI条目、环境变量、JVM的系统属性、
    	测试时使用@ActiveProfiles("dev") 进行指定
    	
    	@Bean
    	@Profile("dev")
    	public CDPlayer cdPlayer(CompactDisc cd) {
    		return new CDPlayer(cd);
    	}
    

    2.1 自动化装配-组件扫描/自动装配

    2.1.1 备注

    a). 组件bean默认名为首字母小写,或使用@Component("lonelyHeartClub")形式进行指定
    b). @ComponentScan	默认只扫描配置类(即@Configuration)所在的package下的目录
    	@ComponentScan(basePackages = { "other.tet3","t1.t2" })		//可指定多个扫描目录
    

    2.1.2 @Autowired 可标注属性、构造器和任意方法

    a). 不管标注在任意地方,假如有且仅有一个bean匹配依赖,那么这个bean会被装配进来
    b). 如果没有匹配的bean,创建Context时会抛出异常,除非使用@Autowired(required=false)
    c). 若有多个bean满足依赖,Spring会抛出异常,表明没有指定使用哪个bean进行自动装配
    

    2.1.3 处理歧义性

    a). 如下的实例中,当一个接口有多个实现(并都标注了@Component)时,Spring就会报NoUniqBean的错误
    

    标识首选bean --> 某个实现上标注 @Primary

    使用自定义的限定符 @Qualifier

    //@Component和@Autowired都标注
    
    @Component
    @Qualifier("cold")
    public class SgtPepers implements CompactDisc {}
    
    @Autowired
    @Qualifier("cold")
    private CompactDisc cd;
    
    
    //Java显式配置时也可使用
    @Bean
    @Qualifier("cold")
    public CDPlayer cdPlayer(CompactDisc cd) {
    	return new CDPlayer(cd);
    }
    

    2.1.5 示例

    //普通接口
    public interface CompactDisc {
    	void play();
    }
    
    @Component // 标注为Spring组件
    public class SgtPepers implements CompactDisc {
    	private String title = "Sgt. Pepers Heart Club.";
    	private String artist = "The Beatles";
    	
    	@Override
    	public void play() {
    		System.out.println("Playing " + title + " By " + artist);
    	}
    }
    
    @Configuration // 基于java的注解,标明是配置类
    @ComponentScan // 启用注解的组件扫描
    public class CDPlayerConfig {
    }
    
    @RunWith(SpringJUnit4ClassRunner.class) // Spring自带的测试套件
    @ContextConfiguration(classes = CDPlayerConfig.class) // 启用spring文件地址
    public class CDPlayerTest {
    	@Autowired // 标注自动装配
    	private CompactDisc cd;
    
    	@Test
    	public void cdShouldNotBeNull() {
    		assertNotNull(cd);
    	}
    }
    

    2.2 用java代码显式装配-装配第三方组件

    a). JavaConfig不应该侵入业务代码,放在单独的包中
    
    b). @Configuration	创建启用配置类
    c). @Bean 标注方法即可,返回的类注入Spring容器
    

    示例代码

    @Configuration // 基于java的注解
    public class CDPlayerConfig {
    	@Bean // 标注的返回值注入Spring容器中,默认名称为方法名
    	public CompactDisc sgtPepers() {
    		return new SgtPepers();
    	}
    
    	@Bean
    	public CDPlayer cdPlayer(CompactDisc cd) {
    		return new CDPlayer(cd);
    	}
    
    	// @Bean //另一种方法
    //	public CDPlayer getCdPlayer() {
    //		return new CDPlayer(sgtPepers());
    //	}
    }
    
    @RunWith(SpringJUnit4ClassRunner.class) // Spring自带的测试套件
    @ContextConfiguration(classes = CDPlayerConfig.class) // 启用spring文件地址
    public class CDPlayerTestforjava {
    	@Autowired
    	private CompactDisc cd;
    
    	@Test
    	public void cdShouldNotBeNull() {
    		assertNotNull(cd);
    	}
    }
    

    2.3 xml配置-不推荐,无法类型检查

    2.4 混合配置

    a). 自动装配时不区分bean在哪儿.
    

    JavaConfig中引用XML配置

    XML中引用JavaConfig

    3. Spring AOP-基于动态代理,仅限方法拦截

    3.1 AOP术语

    通知(advice)	切面的工作被称为通知, 通知定义了切面是什么以及何时使用。
    	Spring定义了5中类型的通知:
    		Before	---	在方法被调用之前调用通知。
    		After	----	在方法被调用之后调用通知,无论是执行成功还是失败。
    		After-returning --	在方法成功调用之后调用通知。
    		After-throwing --- 	在方法抛出异常后调用通知。
    		Around	---	通知包裹了被调用的方法,在方法调用前后都执行自定义的行为。
    
    连接点(Joinpoint)在应用过程中能够插入切面的一个点。这个点可以使调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点在正常流程中添加新的行为。
    
    切点(Pointcut)如果通知定义了切面的“如何”和“何时”,那切点就定义了“何处”。
    				切点的定义会匹配通知所要织入的 一个或多个连接点。通常使用明确的类和方法名来指定这些切点,或是利用正则表达式来匹配指定类和方法名。
    
    切面(Aspect)	是通知和切点的结合。定义了关于切面的全部内容--它是什么,在何时,在何处完成其功能。
    
  • 相关阅读:
    N层电梯只停一层情况下,求所有人爬楼层数最少
    小组开发用户调研
    《哈利波特》买书最优惠算法
    团队开发——极速蜗牛
    林锐——软件工程思想后两章阅读笔记
    课堂练习之检测水军
    团队开发项目-----来用------典型用户与用户场景分析
    体验结对开发的乐趣(6)--(电梯调度问题)
    团队开发项目-----来用------用户需求调研报告
    课堂练习之最高折扣,最低优惠规划
  • 原文地址:https://www.cnblogs.com/Desneo/p/7647326.html
Copyright © 2011-2022 走看看