Sprin_使用注解进行属性注入和整合Mybatis
Spring—注解开发
注入bean的方式
如果使用注解的前提:
- 在配置文件中添加component-scan
<context:component-scan base-package="需要扫描包的范围"/>
在配置类中添加@ComponentScan(“扫描的路径”)
//表示这个是一个配置类 @Configuration //扫描包,只有扫描了包才可以使用纯注解开发 @ComponentScan("com.itheima") //扫描类路径下面的properties文件 @PropertySource("school.properties") @Import(StudentFactory.class) public class SpringConfig {}
写在类上面
@Component
@Service->代表Service层
@Controller->代表是控制层
@Repository
写在方法上
@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();}
}
属性注入
@Value(“值”)-普通属性使用这种方式
@Autowired-引用类型使用此方式自动状态
- 先按照类型进行匹配,如果有多个相同的类型,则按照成员变量名进行匹配
3.@Qualifier(“注入名”) 这个标签是和@Autowried一起使用
提高类的加载优先级别
- @Primary 如果有两个类实现了同一个接口,可以指定其中一个类的加载优先级@Primary,但是这个注解只能在一个类上使用,不能出现在多个类上
加载properties文件
@PropertySource(“指定文件路径”)
PropertySource("classpath:school.properties")
@PropertySource({“路径”,“路径”})如果需要读取多个配置文件
@PropertySource({"classpath:school.properties","classpath:jdbc.properties"})
控制Bean的加载
- @DependsOn
类上
@DependsOn(“另一个类名”)->使用这个注解的Bean会比指定的Bean先加载到容器中。
应用场景:当A类依赖B类时,可以在B类上使用这个注解,B类就会比A类优先加载。
方法上
同上,在同一个类中。当A方法依赖B方法时,可以在B方法上使用这个注解,B方法就会比A方法优先加载。
- @Orde 配置类的加载顺序
在加载构造方法中指定加载顺序也是一样的
@Lazy延迟加载
- 可以在再方法上
- 也可以写在类上
需要的时候才进行加载,不需要的时候不进行加载
用注解整合Mybaits
流程
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);//设置urlds.setUrl(url);//设置用户名ds.setUsername(password);//设置密码ds.setPassword(password);//配好的DataSourcereturn ds;}}
- 配置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;}//配置映射文件@Beanpublic MapperScannerConfigurer getMapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();//设置与映射配置文件扫描的路径,生成代理对象msc.setBasePackage("com.itheima");return msc;} }
- 导入MybatisCofig和JDBCConfig的类到配置类中
//扫描注解 @ComponentScan("com.itheima") //声明这是一个注解类 @Configuration //可以读取properties内容 @PropertySource("classpath:jdbc.properties") //导入其它JDBCConfig和Mybatis到配置中 @Import({JDBCConfig.class, MybatisConfig.class}) public class SpringConfig {}
- 配置Service的Bean到容器中
@Service public class StudentServiceImp implements StudentService {//这个Dao的接口是由Mybatis中MapperScannerConfigurer实现的代理对象@Autowiredprivate StudentDao studentDao;@Overridepublic List<Student> findAll() {List<Student> all = studentDao.findAll();return all;} }
- 测试
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);} }
效果
自定义导入器(了解)
创建一个类实现ImportSelector接口
public class MyImport implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[0];} }
并重写selectImports方法,返回的是一个String[]数组,数组里面的内容就是存放需要导入Bean的全路径
- 将需要导入的路径写到配置文件中
path=com.itheima.dao.School,com.itheima.dao.Student,com.itheima.dao.Personimp
2. 读取配置文件,将内容进行切分
public class MyImport implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {//读取类路径下面的import.properties文件ResourceBundle bundle=ResourceBundle.getBundle("import.properties");//此时得到的内容是:com.itheima.dao.School,com.itheima.dao.Student,com.itheima.dao.PersonimpString path = bundle.getString("path");//按逗号进行切割String[] split = path.split(",");return new String[0];} }
配置类中的注解@Import(“指定自己的导入器类”)
//表示这个是一个配置类 @Configuration //指定自己的导入器Class对象 @Import(MyImport.class) public class SpringConfig {}
测试
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);} }
效果
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)]
Sprin_使用注解进行属性注入和整合Mybatis相关推荐
- Spring学习笔记(二)——Spring相关配置属性注入Junit整合
一.Spring的相关配置 1.1 Bean元素 class属性:被管理对象的完整类名 name属性:给Bean起个名字,能重复,能使用特殊字符.后来属性 id属性:给Bean起个名字,不能重复,不能 ...
- Spring~用注解读取bean(属性注入、构造方法注入、set注入)
文章目录 注解@Autowired. 属性注入 Setter注入 构造方法注入 三种注入的优缺点 注解@Resource. 1.属性注入 2.构造方法注入 @Resource与@Autowired区别 ...
- Java Spring-注解进行属性注入
2017-11-06 21:19:43 一.Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean Spring的框架中提 ...
- Spring整合Mybatis注解方式
Spring整合Mybatis(注解方式) 目录 Spring整合Mybatis(注解方式) 环境准备 纯注解方式 配置类具体内容 测试类具体内容 环境准备 jar包: Spring所需依赖:spri ...
- AOP和整合mybatis
1.代理模式 代理模式是spring AOP的底层! 代理模式的分类 静态代理 动态代理 1.1静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理角色:代理真 ...
- Spring Boot整合MyBatis
最近项目原因可能会继续开始使用MyBatis,已经习惯于spring-data的风格,再回头看xml的映射配置总觉得不是特别舒服,接口定义与映射离散在不同文件中,使得阅读起来并不是特别方便. Spri ...
- 2.3.3 spring属性注入-注解注入-全注解-配置类扫描
代码: spring2-属性注入-全注解-配置类扫描.zip - 蓝奏云文件大小:12.3 K|https://www.lanzouw.com/iPK5vvq21uf 这个博客,我们使用全注解的方式来 ...
- 2.3.2 spring属性注入-注解注入-半注解注入-后序
代码: spring属性注入-注解注入-半注解后序.zip - 蓝奏云文件大小:15.2 K|https://www.lanzouw.com/iCjbVvpvxaf 上一个博客的半注解是,一个类在xm ...
- 2.3.1 spring属性注入-注解注入-半注解方式-前序
注解注入自由度高,可以对部分类使用注解,也可以对所有类都使用注解. 下面代码是的Category使用xml定义java Bean, Product使用注解来定义java Bean 1.定义Catogo ...
最新文章
- JS 实现MVC的写法
- 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL
- kubernetes 配置kubedns
- Pycharm设置pylint real-time scan实时扫描代码规范
- Visual Tracking:运行ECO模型的GPU版本
- 具有Spring的简单工作流引擎
- 16岁高中生的「卷」,用13000+行代码,从头写了一个C++机器学习库
- 用户态 tcpdump 如何实现抓到内核网络包的?
- c语言自动选课,C语言实现简单学生选课管理系统
- win7旗舰版梦幻桌面高清视频下载
- TCP/IP报文格式及通讯
- excel批量删除密码解除密码保护 可多个密码
- tensorflow2 serving
- BLDC无刷直流电机
- LINQ:使用join进行联接
- 动态海报,一次 Computational Design 实验
- 机器学习四大数据降维方法详解
- html 卡片布局 怎么,卡片式格局(CardLayout)
- 网络协议上课笔记(三) 路由、重要概念、NAT
- Python基础课程-面向对象编程