Spring—注解驱动
注解驱动,就是以注解的形式去替代applicationConfig.xml文件开发项目;而注解仅仅是一个标记,存储了少量的内容信息,具体功能是由框架去实现。
一、常用注解
@Component
//方式1
@Component
public class JdbcConfig {}
//方式2
@Component("jdbcConfig")
public class JdbcConfig {}
@Component是类的注解;@Controller 、 @Service 、 @Repository是@Component的衍生,他们功能都是相同的,只是为了在业务层,数据层,表现层之间有个明显的区分。
@Bean
public class JdbcConfig {
@Bean("dataSource")
public DataSource getDataSource() {
DataSource dataSource = new DruidDataSource();
dataSource.userName("root");
return dataSource;
}
}
@Bean加载第三方资源;设置该方法的返回值作为spring管理的bean。
@Value
@Component
public class Student{
// 1. 属性赋值,省略set方法
@Value("张三")
private String username;
// 2. 方法传参, 对方法的所有参数全部赋值
@Value("3")
public void setNum(int num){
this.num=num;
}
// 3. 读取properties文件属性值
@Value("${jdbc.username}")
private String username;
}
@Value是一个为属性赋值或方法传参的注解,Value值仅支持非引用数据类型和SpEL表达式。
@Autowired
@Autowired
private UserDao userDao
@Autowired是仅支持引用类型的属性注入和方法参数传递,默认按已存在IoC容器中的类型装配。
@PropertySource
@PropertySource(value="classpath:fileName.properties")
public class ClassName{
@Value("${password}")
private String password;
}
@PropertySource是加载properties属性值的注解,不支持*
通配格式,一旦加载,所有 spring 控制的 bean 中均可使用对应属性值。
@Configuration
@Configuration//标记当前类是一个配置类
@ComponentScan("scanPackage")
public class SpringConfig ClassName{}
@Configuration是spring核心配置类的注解,而spring中所有bean都需要@ComponentScan注解进行扫描。
@import
@Configuration
@ComponentScan("scanPackage")
@import("jdbc.Class")
public class SpringConfig ClassName{}
@import的作用是导入第三方 bean 作为 spring 控制的资源;而第三方Bean不需要声明为一个bean,直接以.Class形式导入进行spring核心配置类。
二、注解总结
(一) bean注入方式
1、加在类上:@Component、@Controller、@Service、@Repository。
2、加方法上:@Bean
3、导入的类:@import
(二) bean属性注入
1、注入非引用数据类型:@Value
2、注入引用的数据类型:@Autowired
(三) bean加载配置文件
@PropertySource,在@Value中使用${属性名}
(四) bean的包扫描
@ComponentScan(“scanPackage”)
三、注解开发
(一) 程序运行流程
加载spring核心配置类–>添加bean到容器中(解析bean,相关注解,@Bean)–>bean加载完成即可运行业务程序。
(二)整合mybatis
整合mybatis 就是把相应技术的关键类对象存放到spring的容器中
1、实体类:根据数据库表,遵循ORM映射关系创建。
2、持久层:CRUD方法的创建,定义对应的SQL语句。
-
注解形式
public interface AccountDao { @Insert("insert into account(name,money)values(#{name},#{money})") void save(Account account); }
-
XML配置
<delete id="delete" parameterType="java.lang.String"> delete from st_catalog where id = #{id} </delete>
3、业务层:调用持久层
-
业务层接口
public interface AccountService { void save(Account account); }
-
service实现类
//在service业务层实现类上注入bean @Service("accountService") public class AccountServiceImpl implements AccountService { //注入dao持久层bean @Autowired private AccountDao accountDao; public void save(Account account) { accountDao.save(account); }
4、spring核心配置
-
springConfig核心配置类
//1.注入spring核心配置bean @Configuration //2.扫描所有的bean @ComponentScan("com") //3.注入properties文件 @PropertySource("classpath:jdbc.properties") //4.导入数据源对象和mapper动态代理对象 @Import({JdbcConfig.class,MyBatisConfig.class}) public class SpringConfig { }
-
JdbcConfig配置类
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; //获取数据源对象,赋值,并注入IoC容器 @Bean("dataSource") public DataSource getDataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; } }
-
MyBatisConfig配置类
public class MyBatisConfig { //spring整合mybatis后控制的创建连接用的对象 @Bean public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setTypeAliasesPackage("com.mine.domain"); ssfb.setDataSource(dataSource); return ssfb; } //加载mybatis映射配置的扫描,将其作为spring的bean进行管理 @Bean public MapperScannerConfigurer getMapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.mine.dao"); return msc; } }
5、依赖资源坐标
-
<artifactId>mybatis</artifactId> <artifactId>mysql-connector-java</artifactId> <artifactId>spring-context</artifactId> <artifactId>spring-jdbc</artifactId> <artifactId>druid</artifactId> <artifactId>mybatis-spring</artifactId>