java框架——Spring

核心概念

  • 代码书写现状

    • 耦合度偏高
  • 解决方案

    • 使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
  • IoC(Inversion of Control)控制反转

    • 对象的创建控制权由程序转移到外部,这种思想称为控制反转

Ioc(Inversion of Control)控制反转

使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

Spring技术对IoC思想进行了实现

  • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”

  • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean

DI(Dependency Injection)依赖注入

  • 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。

目标:充分解耦

  • 使用IoC容器管理bean(IoC)

  • 在IoC容器内将有依赖关系的bean进行关系绑定(DI)

最终效果

  • 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

依赖注入方式

思考:向一个类中传递数据的方式有几种?

  • 普通方法(set方法)

  • 构造方法

思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或者字符串呢?

  • 引用类型

  • 简单类型(基本数据类型与String)

依赖注入方式

  • setter注入

    • 简单类型

    • 引用类型

  • 构造器注入

    • 简单类型
    • 引用类型

依赖自动装配

配置中使用bean标签autowire属性设置自动装配的类型

<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.service.impl.BookServiceImpl" autowire="byType"/>

依赖自动装配特征

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  • 自动装配优先级地狱setter注入与构造器注入,同时出现时自动装配配置失效

数据源对象管理

加载properties文件

不加载系统属性

<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>

加载多个properties文件

<context:property-placeholder location="*.properties"/>

加载所有properties文件

<context:property-placeholder location="*.properties"/>

加载properties文件标准格式

<context:property-placeholder location="classpath:*.properties"/>

从类路径或jar包中搜索并加载properties文件

<context:property-placeholder location="classpath*:*.properties"/>

注解开发定义Bean

使用@Component定义bean

@Component("bookDao")
public class BookDaoImpl implements BookDao{
}
@Component
public class BookServiceImpl implements BookService{
}

核心配置文件中通过组件扫描加载bean

<context:component-scan base-package="com.example"/>

Spring提供@Component注解的三个衍生注解

  • @Controller:用于表现层bean定义

  • @Service:用于业务层bean定义

  • @Repository:用于数据层bean定义

@Repository("bookDao")
public class BookDaoImpl implements BookDao{
}
@Service
public class BookServiceImpl implements BookService{
}

纯注解开发

Spring3.0开启了纯注解开发模式,使用Java类代替配置文件,开启了Spring快速开发赛道
Java类代替Spring核心配置文件

@Configuretion
@Component("com.example")
public class SpringConfig{
}

@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式

@ComponentScan({"com.example.service","com.example.dao"})

小结

  1. 定义bean
  • @Component

    • @Controller

    • @Service

    • @Repository

  • <context:component-scan/>

  1. 纯注解开发
  • @Configuration

  • @ComponentScan

  • AnnotationConfigApplicationContext

bean作用范围

使用@Scope定义bean作用范围

@Repository
@Scope("singleton")
public classBookDaoImpl implements BookDao{
}

bean生命周期

使用@PostConstructor、@PreDestroy定义bean生命周期

@Repostory
@Scope("single")
public class BookDaoImpl implements BookDao{
    public BookDaoImpl(){
        System.out.println("book dao constructor ...");
    }
    @PostConstruct
    public void init(){
        System.out.println("book init");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("book destory ...");
    }
}

依赖注入

使用@Autowired注解开启自动装配模式(按类型)

@Service 
public class BookServiceImpl implements BookService{
    @Autowired
    private BookDao bookDao;
    // public void setBookDao(BookDao bookDao){
    //     this.bookDao = bookDao;
    // }
    public void save(){
        System.out.println("book service save ...");
        bookDao.save();
    }
}

自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法

使用@Qualifier注解开启指定名称装配bean

@Service
public class BookServiceImpl implements BookService{
    @Autowired
    @Qualifier("bookDao")
    private BookDao bookDao;
}
@Qualifier注解无法单独使用,必须配合@Autowired注解使用

使用@Value实现简单类型注入

@repository("bookDao")
public class BookDaoImpl implements BookDao{
    @Value("100")
    private String connectionNum; // ???这么鸡掰写法,我人傻了,为啥要这么写直接等号赋值不好吗!?
}

加载properties文件

  • 使用@PropertySource注解加载properties文件
@Configuration
@ComponentScan("com.example")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig{
}
路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*

第三方Bean管理

使用@Bean配置第三方bean

@Configuration
public class SpringConfig{
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/test01");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}

将独立的配置类加入核心配置

  • 方式一:导入式
public class JdbcConfig{
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        // 相关配置
        return ds;
    }
}

使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式

@Configuration
@Import(JdbcConfig.class)
public class SpringConfig{
}

  • 方式二:扫描式(不推荐)
@Configuration
public class JdbcConfig{
    @Bean
    public DataSource dataSrouce(){
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }
}
  • 使用@ComponentScan注解扫描配置类所在的包,加载对应的配置信息
@Configuration
@ComponentScan({"com.example.config"})
public class SpringConfig{
}

第三方bean依赖注入

引用类型依赖注入

@Bean
public DataSource dataSource(BookService bookService){
    System.out.println(bookService);
    DruidDataSource ds = new DruidDataSource();
    // 属性设置
    return ds;
}

引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

posted @ 2022-10-03 18:40  maplerain  阅读(32)  评论(0编辑  收藏  举报