Spring基础

spring简介

基础技术

  1. java
  2. 反射
  3. xml
  4. xml解析
  5. 代理
  6. 大量设计模式

关键在于在容器中获取对象,spring默认是单例模式

基础环境搭建

数据库的操作

  mysql
  mysql-connector-java
  8.0.13


          org.springframework
          spring-tx
          5.0.8.RELEASE


          org.springframework
          spring-jdbc
          5.0.8.RELEASE
      


    com.mchange
    c3p0
    0.9.5.2


  1. 添加spring依赖(有四个context,core,beans,expression,但是context依赖其他的3种,所以只需要导入context即可)

    
              org.springframework
              spring-context
              5.0.8.RELEASE
    
    
  2. 编写一个spring的配置文件(放在resources下)

    
    
    
        
            
            
        
    
    
  1. 通过spring的应用程序上下文对象获取对象
@Test
public void m1(){
        //获取上下文对象,spring里面声明对象都需要通过上下文对象获取
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        Girl girl1 = ctx.getBean("girl", Girl.class);
        System.out.println(girl);
    }

ClassPathXmlApplicationContext()函数里面可以传入String数组,达到读取多个配置文件的目的

核心学习内容

IOC

  1. 控制反转(inverse of control)也称依赖注入

    控制:创建对象 ,彼此关系的权利

    反转:此权利交给了spring容器

  2. spring的配置文件值的注入:

  • setter注入(最常用):

必须其字段有对应setter方法才可以完成name setName();

通过property子节点完成注入

报错分析:

No default constructor found; nested exception is java.lang.NoSuchMethodException: com.sz.pojo.Girl.()

com.sz.pojo.Girl这个类必须要有无参构造器

  • 构造注入:


        
        



        

bean分析

  1. 属性分析

abstract(true):表示该bean不能被实例化,只能被继承

parent:表示该bean继承于哪个bean,用id做标识符

init-method:初始化时自动调用的方法,适合数据库连接,数据源的注入

destroy-method:销毁时自动调用的方法

lazy-init(true):默认容器ctx被实例化时就会去执行配置文件applicationContext.xml中里面注册了的bean的无参构造方法

但是调用了这个属性的bean,会在调用bean的时候才执行无参构造方法

scope(prototype):调用该bean声明的对象都是不同的,都是新new出来的

scope(singleton):调用该bean声明的对象是相同的,都是同一个,默认是这种

depends-on:依赖的bean,如果某一个bean严重依赖另一个bean

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
((ClassPathXmlApplicationContext) ctx).close();
((ClassPathXmlApplicationContext) ctx).refresh();
//这两个方法调用其中之一才会执行destroy-method方法
  1. 子标签分析

    property标签:

    name(javabean的属性),value(字面值可以表示的),ref(字面值无法表示的)

    
    
            
            
        
       
        
    

    其他类型

    
            
            
            
        
            
                
                    刘德华
                    郭富城
                
            
        
            
                
                    1
                    2
                
            
        
            
                
                    
                    
                        
                    
                    
                        
                    
                
            
        
        
            
            
                
                        
                
            
            
                
                        
                
            
            
        
        
    

自动注入(autowire)

  • byType:按照类型注入,在上下文搜索对应需要的bean(primary="true"默认也是true)

    如果该类型有且只有一个,匹配成功

    如果没有该类型则不注入

    如果超过一个,则报错

    
    
    
        
        
    
    
  • byName:按照javabean对应的pojo里面的属性名来匹配

    
    
    
        
        
        
    

    下面的了解即可,用处不大

  • byConstructor

  • default

  • no

引入外部文件

applicationContext.xml中:


    
 
    
    
        
        
        
        
        
    

常用注解

component

controller(springmvc,强调处理控制层)

service(业务层)

repository(强调数据访问层)

四个注解功能相同

  1. 注解里面的userService就是bean的id
package com.sz.service;
@Component("userService")
public class UserService {
    public void eat(){
        System.out.println("吃了");
    }
}
  1. 注册com.sz.service下的有@Component注解的bean
application.xml中:


AOP(xml版本)

专业术语

  1. target:目标类,需要被代理的类。例如:UserService
  2. Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
  3. PointCut 切入点:已经被增强的连接点。例如:addUser()
  4. advice 通知/增强,增强代码。例如:after、before
  5. Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
  6. proxy 代理类
  7. Aspect(切面): 是切入点pointcut和通知advice的结合

​ 一个线是一个特殊的面。

​ 一个切入点和一个通知,组成成一个特殊的面。

通知

• 前置通知 org.springframework.aop.MethodBeforeAdvice

• 在目标方法执行前实施增强

• 后置通知 org.springframework.aop.MethodAfterAdvice

• 在目标方法执行前实施增强

• 后置返回通知 org.springframework.aop.AfterReturningAdvice

• 在目标方法返回值执行后实施增强

• 环绕通知 org.aopalliance.intercept.MethodInterceptor(功能最强,但是用得少)目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知 是不能决定的,他们只是在方法的调用前后执行通知而已,即目标方法肯定是要执行的。

• 在目标方法执行前后实施增强

• 异常抛出通知 org.springframework.aop.ThrowsAdvice

• 在方法抛出异常后实施增强

• 引介通知 org.springframework.aop.IntroductionInterceptor

在目标类中添加一些新的方法和属性

切入点表达式

1.execution() 用于描述方法 【掌握】

​ 语法:execution(修饰符 返回值 包.类.方法名(参数) throws异常)

​ 修饰符,一般省略

​ public 公共方法

​ * 任意

​ 返回值,不能省略

​ void 返回没有值

​ String 返回值字符串

​ * 任意

​ 包,[省略]

​ com.itheima.crm 固定包

​ com.itheima.crm.*.service com包下面子包任意 (例如:com.itheima.crm.staff.service)

​ com.itheima.crm.. com包下面的所有子包(含自己)

​ com.itheima.crm.*.service.. com包下面任意子包,固定目录service,service目录任意包

​ 类,[省略]

​ UserServiceImpl 指定类

​ *Impl 以Impl结尾

​ User* 以User开头

​ * 任意

​ 方法名,不能省略

​ addUser 固定方法

​ add* 以add开头

​ *Do 以Do结尾

​ * 任意

​ (参数)

​ () 无参

​ (int) 一个整型

​ (int ,int) 两个

​ (..) 参数任意

​ throws ,可省略,一般不写。

步骤

  1. 额外补充的依赖

    org.aspectj
    aspectjweaver
    1.9.2



    org.aspectj
    aspectjrt
    1.9.2

  1. 配置文件



    
    
    
    

    
    


    
        
        

    


  1. 测试
 ApplicationContext ctx=new ClassPathXmlApplicationContext("application.xml");
 ProviderService demo = ctx.getBean("providerService", ProviderService.class);
 demo.add();

AOP(注解)

@order(数字)注解可以指定before通知的执行顺序,数字小的先执行(类级别的注解)

@order(数字)注解可以指定after通知的执行顺序,数字大的先执行(类级别的注解)

package com.sz.advice;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Order(1)//标记顺序
@Aspect//标记为切面
@Component//相对于在xml中注册bean
public class BeforeAdvice {
    @Before("execution(* com.sz.service.*.*(..))")
    public void before(){
        System.out.println("在一个世纪以前");
    }
}

常见注解总结

  1. Configuration:标明一个类为配置类,然后程序启动的时候只要扫描这个类,就可以清楚所有的配置规则
  2. Component:标明一个类为spring的一个组件,可以被spring容器所管理
  3. Service:同上,语义为服务层
  4. Repository:同上,语义为Dao层
  5. Controller:同上,语义为控制层
  6. ComponentScan:组件扫描,可以绝对去扫描哪些包
  7. Bean:用于在spring容器中注册一个Bean
  8. Autowired:自动注册bean,会按类型装配
  9. @Resource默认按名称装配,如果不到与名称匹配的bean,会按类型装配。

你可能感兴趣的:(Spring基础)