Sprin_使用注解进行属性注入和整合Mybatis

Spring—注解开发

注入bean的方式

如果使用注解的前提:

  1. 在配置文件中添加component-scan
<context:component-scan base-package="需要扫描包的范围"/>
  1. 在配置类中添加@ComponentScan(“扫描的路径”)

    //表示这个是一个配置类
    @Configuration
    //扫描包,只有扫描了包才可以使用纯注解开发
    @ComponentScan("com.itheima")
    //扫描类路径下面的properties文件
    @PropertySource("school.properties")
    @Import(StudentFactory.class)
    public class SpringConfig {
    
    }
    
写在类上面
  1. @Component

  2. @Service->代表Service层

  3. @Controller->代表是控制层

  4. @Repository

写在方法上
  1. @Bean -如果不是写在配置类中,需要使用上面的4个注解中的其中一个

    此注解一般是用来加载第三方提供的配置。

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class StudentFactory {
    @Bean("getStudent")
    public Student getStudent(){
        return  new Student();
    }
}

属性注入

  1. @Value(“值”)-普通属性使用这种方式

  2. @Autowired-引用类型使用此方式自动状态

    1. 先按照类型进行匹配,如果有多个相同的类型,则按照成员变量名进行匹配

在这里插入图片描述

3.@Qualifier(“注入名”) 这个标签是和@Autowried一起使用

在这里插入图片描述

提高类的加载优先级别

  • @Primary 如果有两个类实现了同一个接口,可以指定其中一个类的加载优先级@Primary,但是这个注解只能在一个类上使用,不能出现在多个类上

加载properties文件

  • @PropertySource(“指定文件路径”)

    PropertySource("classpath:school.properties")
    
  • @PropertySource({“路径”,“路径”})如果需要读取多个配置文件

    @PropertySource({"classpath:school.properties","classpath:jdbc.properties"})
    

控制Bean的加载

  • ​ @DependsOn
  1. 类上

    @DependsOn(“另一个类名”)->使用这个注解的Bean会比指定的Bean先加载到容器中。

    应用场景:当A类依赖B类时,可以在B类上使用这个注解,B类就会比A类优先加载。

  2. 方法上

    同上,在同一个类中。当A方法依赖B方法时,可以在B方法上使用这个注解,B方法就会比A方法优先加载。

  • @Orde 配置类的加载顺序

在这里插入图片描述

在加载构造方法中指定加载顺序也是一样的

在这里插入图片描述

  • @Lazy延迟加载

    • 可以在再方法上
    • 也可以写在类上

    需要的时候才进行加载,不需要的时候不进行加载

用注解整合Mybaits

流程
  1. JDBCConfig类,配置数据库的链接信息

    //配置JDBC的DataSource
    @Component
    @PropertySource("jdbc.properties")
    public class JDBCConfig {
        //使用配置文件赋值
        @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()
        public DataSource getDataSource(){
            DruidDataSource ds = new DruidDataSource();
            //设置数据库的驱动
            ds.setDriverClassName(driver);
            //设置url
            ds.setUrl(url);
            //设置用户名
            ds.setUsername(password);
            //设置密码
            ds.setPassword(password);
            //配好的DataSource
            return ds;
        }
    
    }
    
    
    1. 配置Mybatis中的SqlSessionFactoryBean和映射配置文件
    @Component
    public class MybatisConfig {
        //配置SqlSessionFactoryBean
        @Bean
        //@Autowired DataSource dataSource 这里的参数就是由JDBCConfig中提供的
        public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){
            SqlSessionFactoryBean ssf = new SqlSessionFactoryBean();
            ssf.setDataSource(dataSource);
            return ssf;
        }
        //配置映射文件
        @Bean
        public MapperScannerConfigurer getMapperScannerConfigurer(){
            MapperScannerConfigurer msc = new MapperScannerConfigurer();
            //设置与映射配置文件扫描的路径,生成代理对象
            msc.setBasePackage("com.itheima");
            return msc;
    
        }
    }
    
    1. 导入MybatisCofig和JDBCConfig的类到配置类中
    
    //扫描注解
    @ComponentScan("com.itheima")
    //声明这是一个注解类
    @Configuration
    //可以读取properties内容
    @PropertySource("classpath:jdbc.properties")
    //导入其它JDBCConfig和Mybatis到配置中
    @Import({JDBCConfig.class, MybatisConfig.class})
    public class SpringConfig {
    }
    
    
    1. 配置Service的Bean到容器中
    @Service
    public class StudentServiceImp implements StudentService {
        //这个Dao的接口是由Mybatis中MapperScannerConfigurer实现的代理对象
        @Autowired
        private StudentDao studentDao;
        @Override
        public List<Student> findAll() {
            List<Student> all = studentDao.findAll();
            return all;
        }
    }
    
    1. 测试
    
    public class APP {
        public static void main(String[] args) {
            //读取核心配置文件
            ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
            //创建业务层
            StudentService bean = ctx.getBean(StudentServiceImp.class);
            //调用业务层的方法
            List<Student> all = bean.findAll();
            //打印结果
            System.out.println(all);
        }
    }
    
    
效果

在这里插入图片描述

自定义导入器(了解)

  1. 创建一个类实现ImportSelector接口

    public class MyImport implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            
            return  new String[0];
        }
    }
    
    
  2. 并重写selectImports方法,返回的是一个String[]数组,数组里面的内容就是存放需要导入Bean的全路径

    1. 将需要导入的路径写到配置文件中
    path=com.itheima.dao.School,com.itheima.dao.Student,com.itheima.dao.Personimp
    

    ​ 2. 读取配置文件,将内容进行切分

    public class MyImport implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            //读取类路径下面的import.properties文件
            ResourceBundle bundle=ResourceBundle.getBundle("import.properties");
            //此时得到的内容是:com.itheima.dao.School,com.itheima.dao.Student,com.itheima.dao.Personimp
            String path = bundle.getString("path");
            //按逗号进行切割
            String[] split = path.split(",");
            return  new String[0];
        }
    }
    
  3. 配置类中的注解@Import(“指定自己的导入器类”)

    //表示这个是一个配置类
    @Configuration
    //指定自己的导入器Class对象
    @Import(MyImport.class)
    public class SpringConfig {
    
    }
    
    
  4. 测试

    public class StudentTest {
        public static void main(String[] args) {
            ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
            School bean = ctx.getBean(School.class);
            System.out.println(bean);
        }
    }
    
    
  5. 效果

在这里插入图片描述

st {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
School bean = ctx.getBean(School.class);
System.out.println(bean);
}
}




5. 效果

[外链图片转存中...(img-gptkdvqv-1595504237133)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值