• Spring 配置数据源-即配置数据结构
      • ①导入数据源的坐标和数据库驱动坐标
      • ②创建数据源对象
      • ③设置数据源的基本连接数据
      • ④使用数据源获取连接资源和归还连接资源
    • demo1 ```java <?xml version=”1.0” encoding=”UTF-8”?>
    1. @Test
    2. public void test2() throws SQLException {
    3. ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    4. DruidDataSource dataSource = (DruidDataSource) app.getBean("dataSource");
    5. Connection connection = dataSource.getConnection();
    6. System.out.println(connection);
    7. connection.close();
    8. }
    
       - 注解开发,使用注解类;见下面demo
    
    - Spring注解开发-原始注解
       - 想想前面,我们把类的创建交给Spring,需要在代表Spring的配置文件中进行配置
          - 一个对象-一个Bean
             - 唯一的id
             - 对象的全类名
             - 字段-Property(引用数据、基本数据类型、list、map)等
       - 这种配置是麻烦的,可以通过注解开发
       - 原始注解
          - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22442214/1633792029632-ee75e534-c549-4c4d-b922-4baca99f977f.png#clientId=ue77fa308-a565-4&from=paste&height=270&id=ub34e7096&margin=%5Bobject%20Object%5D&name=image.png&originHeight=539&originWidth=1166&originalType=binary&ratio=1&size=78628&status=done&style=none&taskId=u0c02867c-2a6b-4e30-bec0-9229a86df21&width=583)
          - 使用
             - 使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
    ```java
    <!--注解的组件扫描-->
    <context:component-scan base-package="com.jquan.learn"></context:component-scan>
    
         - 使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化
            - **两个要素:全类名,id 都有了,这样Spring就能帮我们创建对象了**
    
    //<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
    //@Component("userDao")
    @Repository("userDao")
    public class UserDaoImpl implements UserDao {
        public void save() {
            System.out.println("save running...");
        }
    }
    
    package com.jquan.learn.service.impl;
    
    
    import com.jquan.learn.dao.UserDao;
    import com.jquan.learn.service.UserService;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Service;
    
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    
    //<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    //@Component("userService")
    @Service("userService")
    //@Scope("prototype")
    @Scope("singleton")
    public class UserServiceImpl implements UserService {
    
        @Value("${jdbc.driver}")
        private String driver;
    
        //<property name="userDao" ref="userDao"></property>
        //@Autowired //按照数据类型从Spring容器中进行匹配的
        //@Qualifier("userDao")  //是按照id值从容器中进行匹配的 但是主要此处@Qualifier结合@Autowired一起使用
        @Resource(name="userDao") //@Resource相当于@Qualifier+@Autowired
        private UserDao userDao;
    
        public void save() {
            System.out.println(driver);
            userDao.save();
        }
    
        @PostConstruct
        public void init(){
            System.out.println("Service对象的初始化方法");
        }
    
        @PreDestroy
        public void destory(){
            System.out.println("Service对象的销毁方法");
        }
    
    }
    
    • Spring 新注解
      • 使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如:
        • 非自定义的Bean的配置:
        • 加载properties文件的配置:
        • 组件扫描的配置:
        • 引入其他文件:
      • 使用Spring新注解
        • 定义配置类
        • image.png ```java package com.jquan.learn.config;

    import com.alibaba.druid.pool.DruidDataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource;

    import javax.sql.DataSource;

    // @PropertySource(“classpath:jdbc.properties”) public class DataSourceConfiguration {

    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    
    @Bean("dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    

    }

    Spring 配置类中代入 数据源配置类
    ```java
    package com.jquan.learn.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    
    //标志该类是Spring的核心配置类
    @Configuration
    //<context:component-scan base-package="com.itheima"/>
    @ComponentScan("com.jquan.learn")
    @Import({DataSourceConfiguration.class})
    public class SpringConfiguration {
    
    
    }
    
    • 使用注解获得 Spring 容器: ApplicationContext app = new AnnotationConfigApplicationContext(配置类.Class) ```java package com.jquan.learn.web;

    import com.jquan.learn.config.SpringConfiguration; import com.jquan.learn.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class UserController { public static void main(String[] args) { // ApplicationContext app = new ClassPathXmlApplicationContext(“applicationContext.xml”); // 使用全注解开发 ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);

        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
    

    }

    
    - Spring 集成Junit
       - 原始Junit测试Spring问题
       - 在测试类中,每个测试方法都要获取Spring容器
       - 集成与使用
          - 1导入pom导入坐标
          - 2使用@Runwith注解替换原来的运行期内核
          - 3使用@ContextConfiguration指定配置文件或配置类
          - 4使用@Autowired注入需要测试的对象
          - 5创建测试方法进行测试
    ```java
    
    @RunWith(SpringJUnit4ClassRunner.class)
    //@ContextConfiguration("classpath:applicationContext.xml")
    @ContextConfiguration(classes = {SpringConfiguration.class})
    
    public class SpringJunitTest {
        @Autowired
        private UserService userService;
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void test1() throws SQLException {
            userService.save();
            System.out.println(dataSource.getConnection());
        }
    }