尚硅谷-Spring5框架笔记(一)

 1、Spring框架概述

2、ioc容器

3、aop

4、jdbcTemplate

5、事务管理

6、spring5新特性

一、Spring框架概述

1、spring框架是一个轻量级的开源的java EE开发框架。

2、spring框架解决企业应用开发的复杂性。

3、spring有两个核心:IOC与AOP

(1)、IOC:控制反转,把创建对象过程交给Spring管理。

(2)、AOP:面向切面编程,不修改源代码情况下,进行功能增强。

4、spring特点

    (1)方便解耦,简化开发

     (2)aop支持

     (3)方便程序测试

      (4)方便集成各种框架

        (5)降低Java api使用难度

        (6)方便进行事务处理

5、选取spring 5.2.6版本

6、入门案例

(1)下载spring  

 (2) idea 新建普通Java工程

(3) 导入spring 的jar包。(bean,core,context,core,expresstion+commons-logging)

(4)写代码

(4.1)、创建普通类,类里面创建普通方法。

public class User{
    public void add(){
         system.out.println("add....");
     }
}

(5)创建spring配置文件,在配置文件中创建对象

     (5.1)新建.xml配置文件

二、IOC容器(IOC:实体类确定好类间的关系,使用xml文件按照实体类配置对象的各种属性,工厂根据XML文件创建对象。)

(1)IOC底层原理

(2)IOC 接口(BeanFactory)

(3)IOC操作Bean管理(基于xml)

什么是ioc

(1),控制反转,目的:降低耦合度,高内聚,低耦合。把对象创建和对象之间的调用过程,交给Spring进行管理。

(2)底层原理

       (2.1)xml解析、工厂模式,反射()

尚硅谷-Spring5框架笔记(一)_第1张图片

尚硅谷-Spring5框架笔记(一)_第2张图片

尚硅谷-Spring5框架笔记(一)_第3张图片

(3)IOC接口 

(3.1)ioc思想基于IOC容器完成,ioc容器底层就是对象工厂。

(3.2)spring提供了IOC容器实现的两种方式:两个接口,一个是BeanFactory:IOC容器基本实现,是spring内部使用接口,不提供开发人员使用。加载配置文件时不会创建对象,使用对象时才会创建对象(懒汉式加载对象)。

另一个是ApplicationContext:BeanFatory的子接口,提供更多更强大的功能,一般供开发人员进行使用。

加载配置文件时就创建对象(饥汉式加载对象)。

(3.3)pplicationContext接口实现类

FileSystemXmlApplicationContext(“盘符路径(绝对路径)”)

ClassPathXmlApplicationContext("src目录下类路径")

(3.4)子接口ConfigurableApplicationContext()扩展功能

(4)二种注入方式,无参构造注入与有参构造注入,下面使用有参构造进行注入

(4.1)创建类,定义属性,创建属性对应有参构造方法

public Student{
       int   num;
       String name;
    public student(int num,string name){
          this.num = num;
          this.name = name;
    }
}

(4.2)Spring 配置文件中配置


    
    
    或者
    
    

(5)p命名空间注入

(5.1) 使用p命名空间配置,可以简化基于xml配置方式

(5.1.1)第一步在配置文件中添加p命名空间

 

第二步,进行属性注入,在Bean签里面进行操作



(6)IOC操作Bean管理(xml注入其他类型属性)

(6.1)字面量

public class Book{
      private String name;
      private String author;
      private String address;
      public void setname(String name){this.name = name;}
      public void setauthor(String author){this.author = author;}
      public void setaddress(String address){this.address = address;}
      public void show(){
            system.out.println(name+":"+author+":"+address);
      }
        
}

(6.1.1)null值


    

(6.1.2)属性值包含特殊符号

//方法一:转义字符

//方法二:CDATA

    
    ]]>
    

(6.2)注入外部bean(使用引用,注入其他类的对象)

(6.2.1)创建两个类service类和dao类 

  (6.2.2) 在service调用dao类的方法

(6.2.3)在spring配置文件中进行配置

public interface DAO{
    public void update(){};
}
public class DAOimp implement DAO{
    @override
    public void update(){
        system.out.println("dao.......");
    }
}
public class UserService{
//原来注入方式
// DAO dao = new DAO();
// dao.update();
//新的注入方式
//第一步,创建DAO类属性,生成set方法
    private DAO dao;
    public void setdao(DAO dao){
        this.dao = dao;
    }

    public void show(){
          system.out.println("service.......");
    }
}


//第二步写配置文件xml文件
//配置service 对象

    //注入dao对象
    

//配置dao 对象

(6.3)内部bean和级联赋值(property属性中注入,其它类对象)

 (6.3.1)一对多的关系:部门和员工

一个部门有多个员工,一个员工属于一个部门,部门是一,员工是多。

(6.3.2)在实体类之间表示一对多的关系

//部门类
public class Department{
        String Department_name;
        public void setDepartment(String Department_name)
        {
            this.Department_name = Department_name;
        }
        @override
        public String tostring()
        {
            system.out.println("Department_name"+this.Department_name);
        }
}
//员工类
public class Emplyee{
        String Emplyee_name;
        String Emplyee_gender;
        Department department;
        public void setdepartment(String department)
        {
            this.department = department;
        }
        public void  setEmplyee_name(String Emplyee_name)
        {
            this.Emplyee_name = Emplyee_name;
        }
        public void setEmplyee_gender(String Emplyee_gender)
        {
            this.Emplyee_gender = Emplyee_gender;
        }
}
//配置xml

    //设置两个普通属性
     
     
    //设置一个对象
    
        
            
        
    

(6.4)级联赋值

(6.4.1)第一种方法

//配置xml

    //设置两个普通属性
     
     
    //内部bean注入的方式,级联赋值
    
        
            
        
    
    //外部bean注入的方式,级联赋值
    


      

(6.4.2)第二种方法 

//配置xml

    //设置两个普通属性
     
     
    //外部bean注入的方式,级联赋值
    
    

(6.5)注入集合 

(6.5.1)注入数组类型

(6.5.2)注入LIST集合

(6.5.3)注入map集合

//1、创建实体类
public void Student{
    //数组类型
    private String[] course;
    //list类型
    private List list;
    //map类型
    private Map map;
    //set类型
    private Set sets;
    public void setCourse(String course){
        this.course = course;
    }
    public void setlist( List list){
        this.list = list;
    }
    public void setMap(Map map){
        this.map = map;
    }
    public void setMap(Set sets){
        this.sets = sets;
    }
}
//2、配置xml文件

    //注入数组
    
        
             java 
             c++ 
             c 
             python 
        
    
    //注入list
    
        
             张三 
             李四 
             王五 s
             马六 
        
    
    //注入map
    
        
             
             
        
    
    //注入set
    
        
             张三 
             李四 
             王五 s
             马六 
        
    

(6.5.4)集合里设置对象类型值

//1、创建课程类
public void Course{
    private String CourseName;    
    public void setName(String CourseName){
        this.CourseName = CourseName;
    }
}
//2、创建学生类
public void Student{
    //list类型
    private List courseList;    
    public void setcourseList(List courseList){
        this.courseList = courseList;
    }
}
//xml


    //注入list对象,外部bean注入
    
        
            
            
        
    


    


    

(6.5.5)把集合诸如部分提取出来 

//1、xml中引入新的命名空间util
//2、使用util标签

   三国演义
   水浒传
   西游记
   红楼梦

//3、注入使用

    

(7) FactoryBean

(7.1)Spring有两种Bean,一种普通Bean.另一种是工厂Bean.

(7.2)普通bean,在配置文件中,定义bean类型就是返回类型

(7.3)工厂bean,在配置文件中定义bean类型可以和返回类型不一样

             第一步创建类,让这个类作为工厂Bean,实现接口FactoryBean

            第二步实现接口里的方法,在实现方法中定义返回的bean类型。

//实现接口类
public class MyBean implements FactoryBean{
    @override
    public Course getObject() throws Exceptions{
            Course  course = new Course();
            course.setCourse("java");
            return course;
    }
    @override
    public Class getObjectType(){
            return NULL;
    }
    @override
    public Boolean isSingleton(){
            return false;
    }
}
//配置类

//测试类
@test
public void test2(){
        ApplicationContext application  = new classPathXpthXmlApplicationContext("bean4.xml");
Course course =  context.getBean("MyBean",Course.class);
}

(8)bean的作用域 

(8.1)在spring里,设置创建Bean实例是单实例还是多实例。

(8.2)在spring里,默认设置创建Bean实例是单实例。

(8.3)如何设置单实例还是多实例。

           spring配置文件bean标签里scope属性用于设置单实例还是多实例。

          scope属性值:第一个,默认值,singleton,表示单实例对象;第二个值:prototype,表示多实例对象。

//配置

    

         ()singleton与prototype

第一,singleton表示单实例,prototype表示多实例。

第二,设置Scope是singleton时,加载spring配置文件时侯就会创建单实例对象;

           设置Scope是prototype时,不是加载spring配置文件时侯创建对象,而是在调用getBean方法时创建多实例对象。

            request,表示一次请求,每次创建对象放到request域对象中。

            session,表示一次会话,每次创建对象放到session域对象中。

(9)Bean生命周期

    (9.1)从对象创建到对象销毁的过程。

   (9.2)bean生命周期

           (9.2.1)通过构造器创建Bean实例(无参构造)

           (9.2.2)为bean的属性设置值和对其他bean的引用(调用set方法)

           (9.2.3)调用bean的初始化方法(需要进行配置初始化的方法)

           (9.2.4)bean可以使用(获取到对象)

           (9.2.5)当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法) 

//实体类
public class Orders{
    //无参构造
    public  Orders(){
        System.out.println("第一步;调用无参构造方法");
    }
    private String order_name;
    public void setOrder_name(String order_name){
        this.order_name = order_name;
        System.out.println("第二步;调用set方法,设置属性值");
    }
   //创建执行的初始化方法
    public void initMethod(){
        System.out.println("第三步;执行初始化方法")
    }
   //创建执行的销毁方法
    public void destoryMethod(){
        System.out.println("第五步;执行销毁方法")
    }
}
//xml

    

//测试类
public void testBean3(){
    //ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
     ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Orders order = context.getBean("orders",Orders.class);
    System.out.println("第四步;获取创建bean实例对象");
    System.out.println(oders);
    //手动销毁
    context.close() 
}


 (9.3)bean后置处理器bean生命周期有7步 

           (9.3.1)通过构造器创建Bean实例(无参构造)

           (9.3.2)为bean的属性设置值和对其他bean的引用(调用set方法)

           (9.3.3)把bean实例传到bean后置处理器的方法

           (9.3.4)调用bean的初始化方法(需要进行配置初始化的方法)

           (9.3.5) 把bean实例传到bean后置处理器的方法

           (9.3.6)bean可以使用(获取到对象)

           (9.3.7)当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)            

//创建类,实现接口BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor{
    @override
    public Object postProcessBeforeInitialization(Object bean,String beanName)throws BeanException{
        System.out.println("初始化方法之前执行");
        return bean;
    }
    @override
    public Object postProcessAfterInitialization(Object bean,String beanName)throws BeanException{
        System.out.println("初始化方法之后执行";
        return bean;
    }
}
//配置后置处理器,当前配置文件的所有bean都会执行该后置处理器

(10)xml方式的自动装配

         (10.1)什么是自动装配

               根据指定的装配规则(属性名或者属性类型),Spring自动将匹配的属性值进行注入。

//实体类
public class Emp{
    private Dept dept;
    public void setDept(Dept dept){
        this.dept=dept;
    }

    @override
    public String toString(){
        return "Dept"+dept;
    }
}
public class Dep{
    @override
    public String toString(){
        return "Dept";
    }
}
//手动装配xml

    


//自动装配,autowire属性,
//byName根据属性名称注入,注入值bean的id值和类属性名称一样


//自动装配,autowire属性,byType根据属性类型注入
//byType只能有一个该类型实例,多个实例会报错


//测试类

(11)引入外部属性文件(数据库为例)

        (11.1)第一种方法:直接配置数据库信息

         (11.2)第二种方法:引入外部属性文件配置数据库连接池

           步骤:

                     (第一步)引入连接池依赖

                    (第二步)配置德鲁伊连接池

//1、固定值直接配置连接池

    
    
    
    

//2、引入外部的文件配置连接池
//(2.1)创建外部属性文件,properties格式文件,写出数据库信息
prop.driverClass = com.mysql.jdbc.Driver
prop.url = jdbc:mysql://localhost:3306/userDataBase
prop.user = root
prop.password = root
//(2.2)properties文件引入到spring配置文件中
//(2.2.1)引入名称空间context

//(2.2.2)spring配置文件中进行引入

//(2.2.3)配置连接池

    
    
    
    

(10)基于注解方式

         格式:@注解名称(属性名=属性值,属性名=属性值)

         使用注解:注解作用在类(方法,属性)上

         使用目的:简化xml配置

       (10.1)创建对象注解(4个)

                  @Component       普通用法

                  @Service               用于service业务逻辑层

                  @Controller          用于web层

                  @Repository         用于DAO持久层

                    上面四个注解功能一样,都可以用来创建bean对象

                  基于注解方式实现对象创建例子

//1、引入依赖
spring-aop-5.2.6.RELEASE
//2、引入context名称空间
//3、开启组件扫描,多个包,使用逗号隔开,或者写共同的上层目录

//创建类并使用注解
//value值默认值为首字母小写的类名
@service(value = "userService")
public class UserService{
  
    public void searchAll(){
           System.out.println("seach all");
    }
}
//测试方法
@test
public void testService(){
    ApplicationContext context = new classPathXmlApplicationContext("bean.xml");
    UserService uservice = context.getBean("userService",Uservice.class);
    System.out.println(userservice);
    userservice.searchAll();
}

(10.2)组件扫描配置

//use-default-filters=false表示现在不使用默认filter,自己配置filter
//include-filter配置扫描的注解
//exclude-filter配置不扫描的注解

    


    

(11)基于注解方式实现属性注入

         (11.1)@Autowired :根据属性类型进行注入

           (11.2)   @Qualifier   :根据名称注入

           (11.3)   @Resource  :可以根据类型注入也可以根据名称注入

         (11.4)@Value:注入普通类型属性

(12)完全注解开发

//完全注解开发
//(1)配置类,代替配置文件
@CompanScan(basePackages = {"com.zhh"})
@Configuration //作为配置类,代替xml文件
public class SpringConfig{
    
}
//(2)创建类并使用注解
//value值默认值为首字母小写的类名
@service(value = "userService")
public class UserService{
  
    public void searchAll(){
           System.out.println("seach all");
    }
}
//(2)编写测试类
public class TestSpringDemo{
    @test
    public void testService(){
        ApplicationContext context = new ClassPathApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService",UserService.class);
        System.out.println(userService);
        userService.add();
    }
    @test
    public void testService(){
        ApplicationContext context = new AnnotationConfigApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService",UserService.class);
        System.out.println(userService);
        userService.add();
    }

}

 

你可能感兴趣的:(java,spring)