1,第三方资源配置管理:

A,管理DataSource连接池对象:

  1. - **导入的druid坐标:**
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.16</version>
</dependency>

//使用的druid连接池,还需要使用数据库的驱动
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.46</version>
</dependency>

Druid是一款由阿里巴巴开发的连接池依赖类库;

  - **配置数据源对象作为Spring管理的bean:**
    <!--  将数据源对象放到容器中  -->
    <bean class = "com.alibaba.druid.pool.DruidDataSource" id = "dataSource">
        <!--        用户名,密码,驱动,连接字符串-->
        <property name = "username" value = "root"/>
        <property name = "password" value = "root"/>
        <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
        <property name = "url" value = "jdbc:mysql://localhost:3306/spring_db"/>
    </bean>

B,* 加载propreties属性文件:

为何要将数据源配置的代码放到propreties属性文件中呢? 目的是,降低在配置文件中的代码耦合度,减少代码的重复,提高可读性;方便在后期进行修改与管理;

  - **propreties属性文件:**
jdbc.username=root;
jdbc.password=root;
jdbc.url=jdbc:mysql://localhost:3306/spring_db;
jdbc.driverClassName=com.mysql.jdbc.Driver;
  - **在配置文件中读取propreties配置信息:**
//直接写上这句话idea就自动会帮你补Schema约束
//property-placeholder:是这行语句的快捷生成关键字;            classpath:代表在resource配置文件夹目录下(路径);
<context:property-placeholder location="classpath:jdbc.properties" />

//配置的Schema约束:
<beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       //context的命名空间
       xmlns:context = "http://www.springframework.org/schema/context"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
       //context的文档声明
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
       //Spring-context
       https://www.springframework.org/schema/context/spring-context.xsd">
<!--  将数据源对象放到容器中  -->
<bean class = "com.alibaba.druid.pool.DruidDataSource" id = "dataSource">
  <!--        用户名,密码,驱动,连接字符串                使用 ${} 读取加载属性值                 -->
  <property name = "username" value = "${jdbc.username}"/>
  <property name = "password" value = "${jdbc.password}"/>
  <property name = "driverClassName" value = "${jdbc.driverClassName}"/>
  <property name = "url" value = "${jdbc.url}"/>
</bean>
  - **创建容器获取连接对象:**
@Test
public void setTextDataTest(){
    //创建容器:
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //获取连接对象
    DataSource dataSource = (DataSource) context.getBean("dataSource");
    //输出连接对象
    System.out.println("dataSource = " + dataSource);
    //关闭容器
    context.close();
}

2,Spring容器:

A,* 创建容器的三种方式:

  1. **类路径加载配置文件:(常用)**
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  2. 文件路径加载配置文件:
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");
  3. 加载多个配置文件:
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

B,容器类层次结构图:

image.png

  • BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
  • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
  • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
  • ApplicationContext接口常用初始化类:
  • ClassPathXmlApplicationContext
  • FileSystemXmlApplicationContext

C,* 获取bean对象的三种方式:

  1. 使用bean名称获取:
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
  2. 使用bean名称获取并指定类型:
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
  3. 使用bean类型获取
BookDao bookDao = ctx.getBean(BookDao.class);

3,* Spring注解开发:

A,注解开发定义bean的步骤(有xml配置):

  1. **使用 @Componet 注解定义bean:**

如果定义bean时无id,那么默认为以类名小写字母开头作为id;bookServiceImpl;

//定义bean,id为bookDao
@Component("bookDao")
public class BookDaoImpl implements BookDao {

}

//如果定义bean无id,那么默认为以类名小写字母开头作为id;bookServiceImpl
@Component
public class BookServiceImpl implements BookService {

}
  2. **核心配置文件(xml)中通过组件(基包)扫描加载bean:**
//基包扫描路径为项目包的路径,示例可见下图;
<context:component-scan base-package="top.jztice5"/>
  3. **获取容器连接对象并使用bean:**

使用IoC的类路径建立容器连接的方法:ClassPathXmlApplicationContext(“applicationContext.xml”)

public class BookTest02 {

    @Test
    public void setTextBookService(){
        //获取连接对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookService bookService = (BookService) context.getBean("bookService");

        bookService.save();

        context.close();
    }

}

B,* 纯注解开发方式/步骤(无xml配置):

  1. **纯注解开发必须要定义配置类:**
     - **使用    @Configuration 注解:表明该类为Spring的配置类;**
     - **使用 @ComponentScan("和项目包路径相同"):指定基包扫描路径**
     - ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1648105380660-607a9386-2d3f-4adc-a46a-aaaae4b3be7e.png#clientId=u4bb12b38-ac0d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=85&id=g1h2P&margin=%5Bobject%20Object%5D&name=image.png&originHeight=128&originWidth=230&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3549&status=done&style=none&taskId=u155f8f3c-1d1b-4fe0-8035-61c171577b1&title=&width=153.33333333333334)包路径示例;**配置类**命名规范:![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1648106358804-7dbada70-79a3-4964-be6c-4b759cab0f2c.png#clientId=u163a0a87-0c44-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=57&id=u9496765d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=85&originWidth=251&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3780&status=done&style=none&taskId=u75cc8562-6797-4e67-8c90-c04a82e714e&title=&width=167.33333333333334)
//表示这是一个配置类
@Configuration
//base-Packages 指定扫描哪些包,别名叫value,如果要扫描多个包,那使用数组进行存放;
//要和项目包的路径名一致;
@ComponentScan("top.jztice5")
public class SpringConfig {

}

· 类对应的注解:(仅语义上的区别)

     - **@Component:普通类**
     - **@Controller:控制器**
     - **@Service:业务类**
     - **@Repository:持久层**
  2. **创建定义类并加上对应的注解:**
@Service("bookService")
public class BookServiceImpl implements BookService {


    @Override
    public void save () {
        System.out.println("三星970evoplus");
    }
}
  3. **获取容器并使用bean对象:**
  - **纯注解开发方式获取容器连接对象的方法:AnnotationConfigApplicationContext**

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); 需要传入配置类的反射对象;如:SpringConfig.class;

public class BookTest {
    @Test
    public void setTextBookTest(){
        //获取容器连接对象,记得传入配置类对象
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //连接对象获取bean对象
        BookService bookService = (BookService) context.getBean("bookService");
        //输出对象
        System.out.println("daoService = " + bookService);
        //对象调用实现类方法;
        bookService.save();
        //关闭容器:关不关无所谓
        context.close();
    }
}

C,* 注解的依赖注入:

  - **自动装配模式注入:**
     - **使用 @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();

        }
    }
public class BookTest01 {
    @Test
    public void setTextBookTest(){
        //获取容器连接对象,记得传入配置类对象
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //使用连接对象获取接口对象(bean),        类型:自动类型匹配                     
        BookService bookService = (BookService) context.getBean(BookService.class);
        //输出对象
        System.out.println("daoService = " + bookService);
        //接口对象对象调用实现类方法;
        bookService.save();

        //关闭容器:关不关无所谓
        context.close();
    }
}

getBean():里面不再是接口的bean对象id,而是根据接口对象类型获取匹配的bean对象;

注意:

  1. 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法;
  2. 自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
  - **使用 @Qualifier 注解开启指定名称装配bean(了解):**
    @Service
    public class BookServiceImpl implements BookService {
        @Autowired
        @Qualifier("bookDao")
        private BookDao bookDao;
    }
  - **使用 @Value 注入简单类型:**
//加载配置文件
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
    //从jdbc.properties中读取键:jdbc.username,将它的值注入给username
    @Value("${jdbc.username}")
    private String username;
}

//注入简单类型也是可以的;

注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

  - **使用@Resource注解按照名字自动注入:**

有两个重要的属性就是:name和type; spring将name属性解析为bean的名字,⽽type属性则被解析为bean的类型。所以如果使⽤name属性,则使⽤byName的⾃动注⼊策略,如果使⽤type属性则使⽤byType的⾃动注⼊策略。如果都没有指定,则通过反射机制使⽤byName⾃动注⼊策略。

    //@Resource按照名字自动注入;
    @Resource(name = "captchaProducer")
    private Producer captchaProducer;

D, 加载配置文件:

  - 使用 **@Configuration** 表示该类是一个配置类;
  - 使用 **@ComponentScan** 表示基包扫描路径;
  - **使用 @PropertySource 注解加载配置文件:**
//表明该类是一个配置类
@Configuration
//基包扫描路径,自动扫描这个包或它的子包下所有的配置文件
@ComponentScan("top.jztice5")
//导入配置类到该核心配置类
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {

}
  - **配置文件格式:(文件后缀:.properties)**
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.driverClassName=com.mysql.jdbc.Driver

4,* 第三方bean的管理(使用注解):

A,@Bean注解的使用:

  - **Bean注解要放到获取bean的方法上面;**
  - 获取到的对象会自动放到容器中;
  - **如果方法有参数,默认会安装类型匹配的方式到容器中找;**
    /**
     * 创建会话工厂
      */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //设置实体类路径别名
        sqlSessionFactoryBean.setTypeAliasesPackage("top.jztice5.pojo");
        //设置数据源对象
        sqlSessionFactoryBean.setDataSource(dataSource);
        //返回工厂对象;
        return sqlSessionFactoryBean;
    }

这里使用第三方bean创建会话工厂,以便于后期获取会话对象使用连接池与数据库进行连接;

B,* 第三方bean的获取:

1,方式一:导入式(推荐)

  - **第三方bean的获取必须要通过导入第三方bean所在的配置类到核心配置类;**`**(直接获取核心配置对象容器就能自动获取对应的bean)**`
  - **使用 @Import 导入配置到核心配置类:**
//表明该类是一个配置类
@Configuration
//基包扫描路径,自动扫描这个包或它的子包下所有的配置文件
@ComponentScan("top.jztice5")
//导入 jdbc和Mybatis 的配置类到该核心配置类
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {

}

2,方式二:扫描式

  - **使用 @ComponentScan 自动扫描这个包及子包下的所有配置文件;**
  - **不过,被扫描的配置类上方要使用 @Configuration 定义配置类;**
//表明该类是一个配置类
@Configuration
//基包扫描路径,自动扫描这个包或它的子包下所有的配置文件
@ComponentScan("top.jztice5")
public class SpringConfig {

}
//表明这是一个配置类
@Configuration
//加载配置文件
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {

注意在整合其他技术的时候,尽量使用扫描与导入式结合的方式来进行获取配置类bean; 不过这样的话,非核心配置类就不用 使用@ComponentScan 注解进行标注为配置类了;

5,使用注解开发时的bean:

A,bean的作用范围:

B,bean的生命周期: