spring走起

spring的优势

spring的优势

  • 方便解耦,简化开发
  • AOP编程的支持
  • 声明式事务的支持(通过配置的方式实现事务控制)
  • 方便程序的测试
  • 方便集成各种优秀框架
  • 降低JavaEE API的使用难度
  • spring的源码是经典的学习范例

常见的配置方式有三种

  • 基于XML的配置、基于注解的配置、基于Java的配置

spring配置读取方式

容器方式有三个
AnnotationConfigApplicationContext:使用注解配置
ClassPathXmlApplicationContext:它可以加载类路径下的配置文件。要求配置文件必须在类路径下,不在的话。加载不了。
FileSystemXmlApplicationContext:可以加载磁盘任意位置的配置文件(需要访问权限)

@Configuration
//@ComponentScan(basePackages = {"com.wangge"})
public class BeansFactory {
//使用@Bean的类就无需再加上@Component(
//包括@Repository、@Service、@Controller),由于默认是>singleton,会报错!
   @Bean("saveDao")
   @Scope("singleton")
   public SaveDao getSD(){
       return new SaveDaoImpl();
   }
   @Bean("saveService")
   public SaveService getSS(){
       return new SaveServiceImpl();
   }
   public static void main(String[] args) {
       ApplicationContext ctx = new >AnnotationConfigApplicationContext("com.wangge.configurati>on");
       SaveService saveService = >(SaveService)ctx.getBean("saveService");
      saveService.save();
   }
}

ApplicationContext 与BeanFactory的比较

ApplicationContext(单例对象适用,)
它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。
BeanFactory(这是一个顶层接口,多例模式适用,但是使用的很少)
它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。

创建Bean的三种方式

  • 通过全类名(反射)
  • 通过工厂方法(静态工厂方法 & 实例工厂方法)
  • FactoryBean(实体类实现该接口,但是还是得在xml中配置它,对象简单的时候用这个有点多此一举,复杂对象适用)

依赖注入的三种方式

  • 使用构造函数提供(constructor-arg)
  • 使用set方法提供(property)
  • 使用注解方法提供

spring的测试类

  • 应用程序的入口
    main方法
  • junit单元测试中,没有main方法也能执行,因为junit集成了一个main方法,该方法就会判断当前测试类中哪些方法有@Test注解,junit就让有Test注解的方法执行;
  • junit不会管我们是否采用spring框架,在执行测试方法时,junit根本不知道我们是不是使用了spring框架,所以也就不会为我们读取配置文件/配置类创建spring核心容器
  • 由以上三点可知
    当测试方法执行时,没有Ioc容器,就算写了Autowired注解,也无法实现注入

导入依赖
使用junit中的@RunWith注解来将main方法替换成spring给我们提供的。
@ContextConfiguration用以告知spring的测试 配置方式 及其 位置

<dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>5.1.9.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>RELEASE</version>
       </dependency>
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {BeansFactory.class} )
public class MyTest {
   @Autowired
   private SaveService saveService;
   @Test
   public void xx(){
       saveService.save();
   }
}

说一点持久层事务管理的前戏!普通的CRUD不是没有事务的,只是他们各自都拿的不同的connection,因而拥有各自独立的事务!那么要实现多个CRUD操作在同一事务下,我虚需要ThreadLocal对象将connection与线程绑定,从而使一个线程中只有一个能控制事务的对象。当事务完成后还需要解除绑定。

AOP

有关于AOP的术语:

  • Joinpoint (连接点):
    被拦截到的点,在spring中,这些点是指方法。(所有方法都是连接点)。
  • Pointcut (切入点):
    需要对哪些连接点拦截和增强,那么这些点就称之为切入点。
    切入点一定是连接点,连接点不一定是切入点。
  • Advice (通知/增强) :
    所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。
    通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
  • Introduction (引介) :
    引介是一种特殊的通知在不修改类代码的前提下,Introduction 可以在运行期为类动态地添加些方法或Field.
  • Target(目标对象) :
    代理的目标对象。
  • Weaving (织入) :
    是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
  • Proxy (代理) :
    一个类被AOP织入增强后,就产生一个结果代理类。
    Aspect (切面) :
    是切入点和通知(引介)的结合。

基于注解的AOP配置

导入依赖(这个依赖用于解析切点表达式的)

<dependency>
           <groupId>org.aspectj</groupId>
           <artifactId>aspectjweaver</artifactId>
           <version>RELEASE</version>
</dependency>
//@Component
@Aspect//声明这是一个配置类
public class Logger {

   @Pointcut("execution(* com.wangge.service.impl.SaveServiceImpl.save())")
   public void getPointcut(){}

   @Before("execution(* *..SaveServiceImpl.*())")
   public void printBeforeLog(){
       System.out.println("前置通知");
   }

   @After("getPointcut()")
   public void printAfter(){
       System.out.println("后置");
   }
}

切点表达式:权限 返回值 包名 类名 方法名(参数)
配置类中开启注解AOP的支持:@EnableAspectJAutoProxy
配置文件中开启注解AOP的支持:<aop:aspectj-autoproxy></ aop:aspectj-autoproxy>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容