注解开发

纯注解开发

  • Spring3.0升级了纯注解开发模式,使用Java类代替配置文件,开启了Spring快速开发通道

  • Java类代替Spring核心配置文件

  • @Configuration注解用于设定当前类为配置类

  • @Component注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式

    @ComponentScan({"com.xhj.dao","com.xhj.service"})
    
  • 读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象

    //加载配置文件初始化容器
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //加载配置类初始化容器
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    

bean管理

bean生命周期

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

    @Repository
    @Scope("singleton")
    public class BookDaoImpl implements BookDao{
        @Override
        public void save() {
            System.out.println("book dao save");
        }
        @PreDestroy
        public void destroy() throws Exception {
            System.out.println("die");
        }
        @PostConstruct
        public void afterPropertiesSet() throws Exception {
            System.out.println("begin");
        }
    }
    

依赖注入

自动装配

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

    @Service
    public class BookServiceImpl implements BookService {
        @Autowired
        @Qualifier("bookDao")
        private BookDao bookDao;
    
        @Override
        public void save() {
            System.out.println("book service save...");
            bookDao.save();
        }
    }
    
  • 注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法

  • 注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供构造方法,请提供唯一的构造方法

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

    @Autowired
    @Qualifier("bookDao")
    private BookDao bookDao;
    
  • 注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

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

  • 使用@PropertySource注解加载properties文件

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

第三方bean管理

  • 使用@Bean配置第三方bean

    /*定义一个方法获得要管理的对象
     * 添加@Bean,表示当前方法的返回值是一个bean*/
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3305/ssmbuild");
        dataSource.setName("root");
        dataSource.setPassword("00000");
        return dataSource;
    }
    
  • 使用独立的配置类管理第三方bean

    public class JdbcConfig {
        /*定义一个方法获得要管理的对象
         * 添加@Bean,表示当前方法的返回值是一个bean*/
        @Bean
        public DataSource dataSource(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3305/ssmbuild");
            dataSource.setName("root");
            dataSource.setPassword("00000");
            return dataSource;
        }
    }
    
  • 将独立的配置类加入核心配置

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

    @Configuration
    @Import({JdbcConfig.class})
    public class SpringConfig {
    
    }
    
  • 方式二:扫描式(不推荐),使用@ComponentScan注解扫描配置类所在的包,加载对应的配置类信息(配置类信息也得加@Configuration注解,不然无效)。

第三方bean依赖注入

  • 简单类型依赖注入

    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3305/ssmbuild")
    private String url;
    @Value("root")
    private String name;
    @Value("00000")
    private String pwd;
    
  • 引用类型依赖注入

    @Bean
    public DataSource dataSource(BookDao bookDao){
        bookDao.save();
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setName(name);
        dataSource.setPassword(pwd);
        return dataSource;
    }
    
  • 引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

注解开发总结

XMl配置与注解配置比较

image-20220903152654249

Spring整合MyBatis

  • MyBatis程序核心对象分析

    //1.创建SqlSessionFactoryBuilder对象                         初始化SqlSessionFactory
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    //2.加载SqlMapConfig.xml配置文件
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    //3.创建SqlSessionFactory对象,核心对象
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    /*------------------------------------------------------------------------------*/
    //4.获取SqlSession                                            获取连接,获取实现
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //5.执行SqlSession对象执行查询,获取结果User
    AccountDao mapper = sqlSession.getMapper(AccountDao.class);
    /*------------------------------------------------------------------------------*/
    Account byId = mapper.findById(2);                           //获取数据层接口
    System.out.println(byId);
    /*------------------------------------------------------------------------------*/
    //7.关闭资源                                                      关闭连接
    sqlSession.close();
    
  • 整合MyBatis

    <configuration>
        <properties resource="jdbc.properties"></properties><!--初始化属性数据-->
    <!------------------------------------------------------------------------------->
        <typeAliases>
            <package name="com.xhj.domain"/>                <!--初始化类型别名-->
        </typeAliases>
    <!------------------------------------------------------------------------------->
        <environments default="development">				<!--初始化dataSource-->
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    <!------------------------------------------------------------------------------->
        <mappers>											<!--初始化映射位置-->
            <package name="com.xhj.dao"></package>
        </mappers>
    </configuration>
    

注解版

  • JdbcConfig.class

    public class JdbcConfig {
        @Value("${jdbc.driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String name;
        @Value("${jdbc.password}")
        private String pwd;
        @Bean
        public DataSource dataSource(){
            /*DriverManagerDataSource dataSource= new DriverManagerDataSource();*/
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(driver);
            dataSource.setUrl(url);
            dataSource.setUsername(name);
            dataSource.setPassword(pwd);
            return dataSource;
        }
    }
    
  • MybatisConfig.class

    public class MybatisConfig {
    
        @Bean
        public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setTypeAliasesPackage("com.xhj.domain");
            sqlSessionFactoryBean.setDataSource(dataSource);
            return sqlSessionFactoryBean;
        }
        @Bean
        public MapperScannerConfigurer mapperScannerConfigurer(){
            MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
            mapperScannerConfigurer.setBasePackage("com.xhj.dao");
            return mapperScannerConfigurer;
        }
    }
    
  • SpringConfig.class

    @Configuration
    @ComponentScan("com.xhj")
    @PropertySource("classpath:jdbc.properties")
    @Import({JdbcConfig.class,MybatisConfig.class})
    public class SpringConfig {
    }
    

整合Junit

  • 导入依赖(统一所有spring依赖的版本!!!

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.3.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    
  • 测试类代码

    //设定类运行器
    @RunWith(SpringJUnit4ClassRunner.class)
    //上下文配置
    @ContextConfiguration(classes = SpringConfig.class)
    public class AppTest {
        @Autowired
        private AccountService accountService;
    
        @Test
        public void findById() {
            System.out.println(accountService.findById(1));
        }
    }