Spring IOC

Spring IOC_第1张图片

 ◆ 传统Javaweb开发的困惑

Spring IOC_第2张图片

 Spring IOC_第3张图片

Spring IOC_第4张图片

Spring IOC_第5张图片

◆ IoC、DI和AOP思想提出

Spring IOC_第6张图片

◆ Spring框架的诞生

Spring | Home

Spring IOC_第7张图片

 Spring IOC_第8张图片

 Spring IOC_第9张图片

IOC控制反转:BeanFactory 快速入门 

Spring IOC_第10张图片

 Spring IOC_第11张图片

Spring IOC_第12张图片

package com.xiaolin.service.Impl;

import com.xiaolin.dao.UserDao;
import com.xiaolin.service.UserService;

public class UserServiceImpl implements UserService {
    //该方法是BeanFactory去调用该方法  从容器中获取userDap设置到此处
    public void setUserDao(UserDao userDao) {
        System.out.println("该方法是BeanFactory去调用该方法  从容器中获取userDap设置到此处"+userDao);
    }
}
package com.xiaolin.service;

public interface UserService {
}
public class BeanFactoryTest {
    public static void main(String[] args) {
        //创建工厂对象
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        //创建一个读取器(xml文件)
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        //读取器配置文件给工厂
        reader.loadBeanDefinitions("beans.xml");
        //根据id获取Bean实例对象

        UserService userService = (UserService) beanFactory.getBean("userService");
//        System.out.println(userService);
    }
}

DI依赖注入:BeanFactory 快速进阶(在一个bean对象中嵌套另一个bean对象)

Spring IOC_第13张图片 Spring IOC_第14张图片

Spring IOC_第15张图片

package com.xiaolin.dao.Impl;

import com.xiaolin.dao.UserDao;

public class UserDaoImpl implements UserDao {
}
package com.xiaolin.dao;

public interface UserDao {
}
public class BeanFactoryTest {
    public static void main(String[] args) {
        //创建工厂对象
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        //创建一个读取器(xml文件)
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        //读取器配置文件给工厂
        reader.loadBeanDefinitions("beans.xml");
        //根据id获取Bean实例对象
        UserService userService = (UserService) beanFactory.getBean("userService");
//        System.out.println(userService);

        UserDao userDao = (UserDao) beanFactory.getBean("userDao");
//        System.out.println(userDao);
    }
}

 - ApplicationContext快速入门

 Spring IOC_第16张图片

package com.xiaolin.test;

import com.xiaolin.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        System.out.println(userService);
    }
}

 applicationContext.xml




    
        
    

    

 BeanFactory与ApplicationContext的关系

Spring IOC_第17张图片

 Spring IOC_第18张图片

 Spring IOC_第19张图片

 Spring IOC_第20张图片

BeanFactory的继承体系 

Spring IOC_第21张图片

ApplicationContext的继承体系 

Spring IOC_第22张图片

 Spring IOC_第23张图片

 Spring IOC_第24张图片

 Spring IOC_第25张图片

◆ 基于xml的Spring应用

- SpringBean 的配置详解

Spring IOC_第26张图片

 1)Bean的基础配置

Spring IOC_第27张图片

2)Bean的别名配置 

Spring IOC_第28张图片

3)Bean的范围配置 【singleton(单例模式)/prototype(多对象模式)】

Spring IOC_第29张图片 Spring IOC_第30张图片

Spring IOC_第31张图片

Spring IOC_第32张图片Spring IOC_第33张图片

 4)Bean的延迟加载

 

 5)Bean的初始化和销毁方法配置

方法一:init-method/destory-method

Spring IOC_第34张图片

方法二: 实现InitializingBean

Spring IOC_第35张图片

 6)Bean的实例化配置【创建Bean方式】

 方法一:构造方法实例化:

Spring IOC_第36张图片

Spring IOC_第37张图片

 当没有无参构造方法而使用有参构造方法时候,要在相关的配置文件中使用,进行配置,name对应参数名,value对应相关的值

方法二:工厂方法实例化

⚫ 静态工厂方法实例化Bean

Spring IOC_第38张图片

Spring IOC_第39张图片

Spring IOC_第40张图片

⚫ 实例工厂方法实例化Bean

Spring IOC_第41张图片

Spring IOC_第42张图片

Spring IOC_第43张图片

⚫ 实现FactoryBean规范延迟实例化Bean

Spring IOC_第44张图片

Spring IOC_第45张图片 Spring IOC_第46张图片

Spring IOC_第47张图片

 7)Bean的依赖注入配置

Spring IOC_第48张图片

 Spring IOC_第49张图片

注入 List 集合 

Spring IOC_第50张图片

Spring IOC_第51张图片

Spring IOC_第52张图片

 注入 Set 集合

Spring IOC_第53张图片

 注入 Map 集合

Spring IOC_第54张图片

 注入 Properties 键值对

Spring IOC_第55张图片

扩展:自动装配方式

Spring IOC_第56张图片

Spring IOC_第57张图片

 8)Spring的其他配置标签

Spring IOC_第58张图片

 Spring IOC_第59张图片Spring IOC_第60张图片

 标签

 Spring IOC_第61张图片Spring IOC_第62张图片

指定其他环境的情况下,默认环境都起作用

标签  

Spring IOC_第63张图片

 标签:起别名

Spring IOC_第64张图片

 

 Spring的自定义标签

先在pom导入坐标

 Spring IOC_第65张图片

- Spring 的get方法

Spring IOC_第66张图片

        Object userDao1 =applicationContext.getBean("userDao1");
        UserDao userDao11 = applicationContext.getBean("userDao1", UserDao.class);
        UserDao bean = applicationContext.getBean(UserDao.class);

- Spring 配置非自定义Bean

Spring IOC_第67张图片

 1)配置 Druid 数据源交由Spring管理

Spring IOC_第68张图片

    
    
      mysql
      mysql-connector-java
      5.1.49
    
    
    
      com.alibaba
      druid
      1.1.23
    

Spring IOC_第69张图片

    
    
        
        
        
        
        
    

2)配置Connection交由Spring管理【静态工厂方法】

Spring IOC_第70张图片

3)配置日期对象交由Spring管理 【实例化工厂方法】

Spring IOC_第71张图片

 4)配置MyBatis的SqlSessionFactory交由Spring管理【多种配置方法统一】

Spring IOC_第72张图片

mybatis-conifg.xml 

Spring IOC_第73张图片

 Spring IOC_第74张图片Spring IOC_第75张图片

- Bean 实例化的基本流程

Spring IOC_第76张图片

 Spring IOC_第77张图片

 Spring IOC_第78张图片

 Spring IOC_第79张图片

 Spring IOC_第80张图片

- Spring的后处理器

Spring IOC_第81张图片

beanDefinitionMap->bean工厂后处理器->循环map(实例化->bean后处理器->填充到单例池) 

 BeanFactoryPostProcessor

Spring IOC_第82张图片

Spring IOC_第83张图片

 Spring IOC_第84张图片

 BeanDefinition 

Spring IOC_第85张图片

 BeanDefinitionRegistryPostProcessor[BeanFactoryPostProcessor的子接口]Spring IOC_第86张图片

 小总结:

Spring IOC_第87张图片

 自定义注解【注解的底层实现】

 Spring IOC_第88张图片

 Spring IOC_第89张图片

 BeanPostProcessor

Spring IOC_第90张图片

 Spring IOC_第91张图片

 Spring IOC_第92张图片

 对Bean方法进行执行时间日志增强

 

 Spring IOC_第93张图片

public class TimeLogBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        //使用动态代理对目标Bean进行增强,返回proxy对象,进而存储到单例池singletonObjects中
        Object beanProxy = Proxy.newProxyInstance(
                bean.getClass().getClassLoader(),
                bean.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    //1、输出开始时间
                    System.out.println("方法:" + method.getName() + "-开始时间:" + new Date());
                    //2、执行目标方法
                    Object result = method.invoke(bean, args);
                    //3、输出结束时间
                    System.out.println("方法:" + method.getName() + "-结束时间:" + new Date());

                    return result;
                }
        );

        return beanProxy;
    }
}

Spring IOC_第94张图片

- Spring Bean的生命周期

Spring IOC_第95张图片

 Bean初始化阶段

Spring IOC_第96张图片

 Bean实例属性填充

Spring IOC_第97张图片

Spring IOC_第98张图片

注入双向对象引用

 Spring IOC_第99张图片

Spring IOC_第100张图片

 Spring IOC_第101张图片

 三级缓存(解决注入双向对象引用)

Spring IOC_第102张图片Spring IOC_第103张图片

Spring IOC_第104张图片

 P54底层源码(欠)

常用的Aware接口

Spring IOC_第105张图片

- Spring IoC 整体流程总结

Spring IOC_第106张图片

 Spring IOC_第107张图片

 Spring IOC_第108张图片

 Spring IOC_第109张图片

硬核讲解:

55-Spring IoC容器实例化Bean整体流程图_哔哩哔哩_bilibili

- Spring xml方式整合MyBatis

Spring整合MyBatis --纯手写Mybatis整合

public interface UserMapper {

    List findAll();

}

 Spring IOC_第110张图片




    
mybatis-config.xml



    
        
            
            
                
                
                
                
            
        
    

    
        
    

    
MyBatisTest
public class MyBatisTest {

    public static void main(String[] args) throws Exception {

        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(in);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List all = mapper.findAll();
        for (User user : all) {
            System.out.println(user);
        }

    }

}

 Spring整合MyBatis 

Spring IOC_第111张图片

        
            org.springframework
            spring-jdbc
            5.2.13.RELEASE
        
        
            org.mybatis
            mybatis-spring
            2.0.5
        

Spring IOC_第112张图片

    
    
        
        
        
        
    

    
    
        
    

    
    
        
    

Spring IOC_第113张图片

Spring IOC_第114张图片 

Spring整合MyBatis的原理剖析 

Spring IOC_第115张图片

SqlSessionFactoryBean 

 执行完SqlSessionFactoryBean后,里面调用了getObject然后产生SqlSessionFactory。

Spring IOC_第116张图片

 

Spring IOC_第117张图片

 

MapperScannerConfigurer

60-Spring整合第三方框架-MyBatis整合Spring-MapperScannerConfigurer_哔哩哔哩_bilibili

Spring IOC_第118张图片

 Spring IOC_第119张图片

Spring IOC_第120张图片

Spring IOC_第121张图片 Spring xml方式整和第三方框架【自定义命名空间】

Spring IOC_第122张图片

 使用外部配置文件Spring IOC_第123张图片

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

Spring IOC_第124张图片

    
    

    
    
        
        
        
        
    
硬核讲解

62-Spring整合第三方框架-自定义命名空间解析原理_哔哩哔哩_bilibili

Spring IOC_第125张图片

 Spring IOC_第126张图片

 Spring IOC_第127张图片

 Spring IOC_第128张图片

 Spring IOC_第129张图片

 Spring IOC_第130张图片

 基本流程Spring IOC_第131张图片

 Spring IOC_第132张图片

P-65-66 

◆ 基于注解的Spring应用

- Bean基本注解开发

Spring IOC_第133张图片

Spring IOC_第134张图片 Spring IOC_第135张图片

 在@Component后面不加value值,默认id是该类名首字母小写

Spring IOC_第136张图片

Spring IOC_第137张图片

 Spring IOC_第138张图片

Spring IOC_第139张图片

- Bean依赖注入注解开发

Spring IOC_第140张图片

@Value 

Spring IOC_第141张图片 

Spring IOC_第142张图片 

 @Autowired【根据类型进行注入】

根据类型进行注入,如果同一个类型的Bean有多个,尝试根据名字进行二次匹配,匹配变不成功的则匹配失败

Spring IOC_第143张图片

 Spring IOC_第144张图片

 

 @Qualifier

结合@Autowired一起使用,作用是根据名称注入相应的Bean

在非自定义属性上要@Autowird+@Qualifier 

Spring IOC_第145张图片

在自定义属性中添加参数名可以单独使用@Qualifier

 Spring IOC_第146张图片

 @Resource

不指定名称参数时,根据类型注入【@Autowired】,指定名称就根据名称注入【@Autowired+@Qualifier】

Spring IOC_第147张图片

- 非自定义Bean注解开发【@Bean】

Spring IOC_第148张图片

注意点:

Spring IOC_第149张图片 

 Spring IOC_第150张图片

 Spring IOC_第151张图片

@Component
public class OtherBean {

    @Bean("dataSource")
    public DataSource dataSource(
            @Value("${jdbc.driver}") String driverClassName,
            @Qualifier("userDao2") UserDao userDao,
            UserService userService
    )
    {

        /*System.out.println(driverClassName);
        System.out.println(userDao);
        System.out.println(userService);*/


        DruidDataSource dataSource = new DruidDataSource();
        //设置4个基本参数 ...

        return dataSource;
    }

}

 Spring IOC_第152张图片

- Bean配置类的注解开发【替代整个配置文件】

Spring IOC_第153张图片

 @Configuration

 @ComponentScan

Spring IOC_第154张图片

 @PropertySource

Spring IOC_第155张图片

 @Import

Spring IOC_第156张图片

@Configuration  //标注当前类是一个配置类(替代配置文件)+@Component-->替代了

//
@ComponentScan("com.itheima")//相当于包扫描

//
@PropertySource("classpath:jdbc.properties")//属性资源

//
@Import(OtherBean.class)

- Spring 配置其他注解

@Primary

Spring IOC_第157张图片

@Profile 【切换环境】

没有指定环境,在任何情况下都可以使用

Spring IOC_第158张图片

- Spring注解的解析原理

Spring IOC_第159张图片

 Spring IOC_第160张图片

 Spring IOC_第161张图片

 Spring IOC_第162张图片

 Spring IOC_第163张图片

- Spring注解方式整合第三方框架

使用xml

Spring IOC_第164张图片

 使用注解Spring IOC_第165张图片

Spring IOC_第166张图片

Spring IOC_第167张图片 

 @import

Spring IOC_第168张图片

@Import导入实现了ImportSelector接口的类

Spring IOC_第169张图片Spring IOC_第170张图片

 @Import导入实现ImportBeanDefinitionRegistrar接口

Spring IOC_第171张图片

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