7:注解开发
7.1:配置bean
- 直接创建一个Spring配置类
- @Configuration:声明当前类为Spring配置类
- @ComponentScan:设置bean扫描路径
- @Component:定义当前类为bean
- @Service:业务层
- @Repository:表现层
- @Controller:控制层
//声明当前类为Spring配置类 @Configuration //设置bean扫描路径,多个路径书写为字符串数组格式 @ComponentScan({"com.ysj.service","com.ysj.dao"}) public class SpringConfig { }
- 改为配置类后,初始化容器对象就切换到读取Java配置类
//AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器 ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
7.2:管理bean
@Scope("singleton") //配置该bean初始化对象是单例 @Scope("prototype") //多例
@PostConstruct //配置初始化方法 @PreDestroy //配置销毁方法
7.3:依赖注入
@Autowired //自动注入,适用于引用类型,默认按类型装配 @Qualifier://依赖于@Autowired,按bean名称进行自动装配 @Value: //适用于简单类型注入,@Value("${name}")可通过EL表达式获取配置文件里的属性值 @PropertySource({"jdbc.properties","jdbc2.properties"}) //加载配置文件,如果有多个,用大括号圈起来 //不允许使用通配符*
7.3.2:管理第三方bean
//1:定义一个方法获得要管理的对象 @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis"); druidDataSource.setUsername("root"); druidDataSource.setPassword("root"); System.out.println(druidDataSource); return druidDataSource; }
- 记得使用独立的配置类管理第三方bean
- 扫描式:给非Spring配置类也加上@Configuration让其变成配置类,接着在Spring配置类进行包扫描即可(不推荐,因为不方便读)
- 导入式:在Spring配置类中Import类(无需将该类变为配置类,推荐)
//@Import:导入配置信息 @Import({JdbcConfig.class})
- 为第三方bean注入资源
简单类型:简单粗暴,直接定义变量,赋值,然后再方法里用
@Value("com.mysql.jdbc.Driver") private String driver; @Value("jdbc:mysql://localhost:3306/spring_db") private String url; @Value("root") private String userName; @Value("root") private String password; //2.添加@Bean,表示当前方法的返回值是一个bean //@Bean修饰的方法,形参根据类型自动装配 @Bean public DataSource dataSource(BookDao bookDao){ System.out.println(bookDao); DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; }
- 假设我们一个bean中还需要使用第三方bean,怎么办?往下看啊!
- 引用类型:先在Spring配置类中加上包扫描(确保能扫描到要使用的第三方bean),然后直接在要使用第三方bean的方法中,加上该类bean类型的形参,Spring容器会根据形参类型自动装配bean。
//2.添加@Bean,表示当前方法的返回值是一个bean //@Bean修饰的方法,形参根据类型自动装配 @Bean public DataSource dataSource(BookDao bookDao){ System.out.println(bookDao); DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; }
7.4:Spring整合mybatis
- 导入相关依赖
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency>
public class MybatisConfig { @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ //1:先造出SqlSessionFactoryBean的对象 SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); //2:设置类型对象所在包 sqlSessionFactoryBean.setTypeAliasesPackage("com.ysj.domain"); //3:设置数据源 sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean; } //4:设置sql文件所在报的扫描路径 @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage("com.ysj.dao"); return mapperScannerConfigurer; } }
最后最后,千万别忘了把mybatis配置文件导入Spring配置类中
@Import({JdbcConfig.class,MybatisConfig.class})
7.5:Spring整合Junit
导入依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.10.RELEASE</version> </dependency>
//设置类运行器 @RunWith(SpringJUnit4ClassRunner.class) //设置Spring环境对应的配置类 @ContextConfiguration(classes = SpringConfig.class)
//支持自动装配注入bean,按类型查找 @Autowired private AccountService accountService; @Test public void testFindById(){ System.out.println(accountService.findById(1)); }