Spring笔记


Spring5

1.前身:interface21

2.发明者:Rod Johnson(悉尼大学 双学位 音乐学 计算机学)

3.轻量级、防入侵

4.优点:轻量级的控制反转(IOC)和面向切面编程(AOP)

5.Spring框架主要由七部分组成,分别是Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

6.弊端:“配置地狱”

一、作用域(scope)

Scope

二、动态代理

  • 动态代理和静态代理角色一样

  • 动态代理的代理类是动态生成的,不是我们直接写好的!

  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

    • 基于接口---JDK动态代理

    • 基于类:cglib

    • java字节码实现:javasist(东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。)

    两个类:Proxy:代理,InvocationHandler:调用处理程序并返回结果(调用处理程序)

三、依赖

 
        
            org.springframework
            spring-webmvc
            5.2.0.RELEASE
        
 

四、创建程序

  • 导入依赖,创建Model项目

  • 创建实体类

  • 配置xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    
          
            
        
    
        
            
        
    
        
    
    
    
  • 创建测试类

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml文件名");
    类名 bean = context.getBean("id名",强转类);
    System.out.println(bean.toString());
    

五、注入对象

  • 在Xml文件中创建

    
        
    
    
    	
    
    

六、注解方式IOC/DI

  • IOC---控制反转
  • DI---依赖注入

七、自动装配Bean

  1. 显式装配

    <?xml version="1.0" encoding="UTF-8"?>
    
        
        
        
            
            
            
        
    
    
  2. Java装配

  3. 隐式装配

    • byName
    <?xml version="1.0" encoding="UTF-8"?>
    
        
        
        
            
    
        
    
    

    byName会自动在容器上下文中找与set后的名称对应的beanId

    • byType
    <?xml version="1.0" encoding="UTF-8"?>
    
        
        
        
            
    
        
    
    

    byType会自动在容器上下文中找与自己对象属性类型相同的类与之对应

八、注解实现自动装配

jdk1.5支持注解,spring2.5支持注解

使用注解须知:

  1. 导入约束:context约束
  2. 配置注解的支持:
<?xml version="1.0" encoding="UTF-8"?>


    
    
    
    

  • @Autowired
    • 可使用在属性或set方法上
    • 可以将set方法去除
    • 当名字或类型有一个相同,则可以在xml文件中更改id对应的值,反之不可以
    • 如果有上述情况,则可以将@Autowired和@Qualifier(value="dog222")配合使用
  • @Resource
    • @Autowired性质差不多,但不可以用在set上
    • 先找byName再byType,最后找不到就报错
    • 当然也可以传参,例如@Resource(name="dog111")
  • 小结
    • 二者均是用来自动装配的,都可以放在属性字段上
    • @Autowired默认通过byType方式,如果有多个类型相同的再按照byName
    • @Resouce默认通过byName方式,如果找不到名字,则通过byType实现,如果二者都找不到,就报错

九、使用注解开发

在使用spring4之后,要使用注解开发,必须要保证AOP的包导入了

image-20220226231349739

  • 创建XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    
        
        
        
    
    
  • 在实体类中使用以下注解

    • @Component:注册类到IOC容器

    • @Resource:javax的自动装配

    • @Autowired:spring的自动装配

    • @Value:给属性赋值

    • @Qualifier :与@Autowired配合使用

十、AOP

? AOP(Aspect Oriented Programming):面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护。Aop是OOP的延续。是函数式编程的一种衍生泛型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合性降低,提高程序的可重用性,同时提高了开发效率。

注意,在pom.xml中导入依赖


    
        org.aspectj
        aspectjweaver
        1.9.8
    

1.使用SpringAPI接口

  • 创建接口

    public interface UserService {
        public void add();
        public void delete();
        public void update();
        public void select();
    }
    
  • 接口实现类

    public class UserServiceImpl implements UserService{
        @Override
        public void add() {
            System.out.println("增加了一个用户");
        }
        @Override
        public void delete() {
            System.out.println("删除了一个用户");
        }
        @Override
        public void update() {
            System.out.println("更改了一个用户");
        }
        @Override
        public void select() {
            System.out.println("查找了一个用户");
        }
    }
    
  • 创建日志

    • 执行之前
    import org.springframework.aop.MethodBeforeAdvice;
    import java.lang.reflect.Method;
    
    public class Log implements MethodBeforeAdvice {
        //method:要执行的目标对象的方法
        //args:参数
        //target:目标对象
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println(target.getClass().getName() + "的" + method.getName() + "被执行了");
        }
    }
    
    • 执行之后
    import org.springframework.aop.AfterReturningAdvice;
    import java.lang.reflect.Method;
    
    public class AfterLog implements AfterReturningAdvice {
        @Override
        public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
            System.out.println("执行了"+method.getName()+"方法,返回结果为"+returnValue);
        }
    }
    
  • 配置xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    
        
            
            
            
        
            
            
            
             
            
        
    
    
  • 测试类

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class Test{
        @Test
        public void t0(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService user = context.getBean("user",UserService.class);
            user.add();
        }
    }
    

2.自定义类实现

与方式一不同的地方为xml文件

<?xml version="1.0" encoding="UTF-8"?>

    
    
    
    
        
        
            
            	
            
        
    

方式二并没有方式一强大

3.注解实现

  • 创建一个业务接口

  • 实现该接口的类添加如下注解

    import org.springframework.stereotype.Component;
    
    @Component("userServiceImpl")
    public class UserServiceImpl implements UserService{
        public void add(){
            System.out.println("用户添加");
        }
    }
    
  • 编写切面类

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class AnnoPoint {
        @Before("execution(* com.dragon.service.UserServiceImpl.*(..))")
        public void before(){
            System.out.println("===方法执行前===");
        }
    }
    

    @Before("execution(* com.dragon.service.UserServiceImpl.*(..))"),注意此句是切到指定类中的某个方法中

  • 配置applicationContext.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    
        
        
        
        
        
        
    
    
  • 利用测试类正常测试

注意事项,在配置xml文件时,三行代码缺一不可