目录
3、生命周期相关
一、Spring常用注解-IOC相关
1、用于创建对象
与xml配置中的<bean id="" class="">标签的作用是一样的,注解是放在类上的
@Component ==> 通用类型的
@Controller ==> 控制层
@Service ==> 业务层
@Repository ==> 数据访问层 / 持久层
作用: 使我们的三层架构的对象,更加清晰, 使开发更规范,符合三层架构!
细节:如果注解中有且只有一个属性要赋值时,value属性是可以不写的,默认是类名,首字母小写
这4个注解有何不同?可以混用吗?
- 这4个注解作用是一样的,但是我们不建议混用!
- 原因: 三层架构: ----分别使用 @Controller @Service @Repository
- @Component --三层架构之外时使用@Component, 主要用于实体类
2、用于改变作用范围
作用和xml配置中的<bean>标签的scope属性的作用一样
@Scope
作用:
指定bean的作用范围。
属性:
value:指定范围的值。
取值:`singleton` `prototype` `request` `session` `globalsession`
常用取值:单例 singleton 多例 prototype
3、生命周期相关
作用和xml配置中的<bean>标签的init-method和destroy-method属性的作用是一样的
@PostConstruct -- 注解放在方法上;初始化对象时执行
@PreDestroy -- 注解放在方法上;对象销毁时执行
二、加载第三方资源的注解
1、@Bean
//@Bean 用于把当前方法的返回值作为bean对象存入spring的ioc容器中,可以指定bean的id。
@Bean("dataSource")
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
2、@bean 和 @component 区别是什么?
@bean注解 写在方法上, 方法的返回值存入spring容器;
@component 写在类上, 给当前类创建对象,存入spring容器中!
3、使用注解整合MyBaitis
public class MyBatisConfig {
/* spring整合mybatis后控制的创建连接用的对象
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.jing.domain"/>
</bean>*/
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.jing.domain");
ssfb.setDataSource(dataSource);
return ssfb;
}
/* 加载mybatis映射配置的扫描,将其作为spring的bean进行管理
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jing.dao"/>
</bean>*/
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.jing.dao");
return msc;
}
}
4、使用注解整合JDBC
/**
* 加载druid资源
* <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
* <property name="driverClassName" value="${jdbc.driver}"/>
* <property name="url" value="${jdbc.url}"/>
* <property name="username" value="${jdbc.username}"/>
* <property name="password" value="${jdbc.password}"/>
* </bean>
*/
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("dataSource")
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
然后就可以配置类 导入了
@Configuration
@ComponentScan("com.jing")
@PropertySource("classpath:jdbc.properties")
@Import({JDBCConfig.class,MyBatisConfig.class})
public class SpringConfig {
}
@Configuration 指定当前类作为一个配置类,在创建容器时作为参数传入! (就是替代applicationContext.xml)
@ComponentScan("com.jing") 用于指定spring在初始化容器时要扫描的包
对比xml文件的配置:<context:component-scan base-package="com.jing"/>
@PropertySource("classpath:jdbc.properties") 加载jdbc.properties配置文件的信息
对比xml文件的配置:<context:property-placeholder location="classpath:jdbc.properties"/>
@Import({JDBCConfig.class,MyBatisConfig.class}) 加载到核心配置
如果使用junit测试
则使用 @RunWith 和 @ContextConfiguration
//设置Spring专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
//设定加载的Spring上下文对应的配置
@ContextConfiguration(classes = SpringConfig.class)
public class UserTest {
@Autowired
private UserService userService;
@Test
public void test01(){
int size = userService.findAll().size();
Assert.assertEquals(8,size);
}
}
5、小结
经过上面的代码实现可以看到,使用第三方注解会比写xml文件繁琐一些,所以一般推荐使用
半注解+半xml 来开发
三、用于注入数据的注解-DI相关注解
作用和xml配置中的<bean>标签中的<property>标签作用一样 注解放在成员变量上
1、引用类型属性注入
@Autowired /*自动按照类型注入,
如果有多个类型相同时, 那么判断bean的id是否和 变量名是否一致,
如果一致那么就对应的注入,也就是 先按照类型 再按照变量名!*/
@Qualifier /*在自动按照类型注入的基础之上,再按照Bean的id注入
它在给字段注入时不能独立使用,
必须和@Autowire一起使用 ;但是给方法参数注入时,可以独立使用*/
例如: @Autowired
@Qualifier("userDao")
private UserDao userDao;
@Resource /*直接按照Bean的id注入。只能注入其他bean类型。
@Resource 是JDK1.8当中的,在JDK1.9之后移除到扩展模块之中,
所以如果想使用@Resource注解注入数据
请使用1.6-1.8及以下版本JDK相当于
@Resource = @Autowired + @Qualifier
@Autowired 、 @Qualifier 是Spring框架中的*/
例如: @Resource(name = "userDao")
private UserDao userDao;
以上三个是给引用变量赋值 -- ref
2、普通类型属性注入
@Value /* 给属性赋值 , 用于基本数据类型 >> value
可以使用SpEL的写法:${表达式} 也就是spring的el表达式 */
例如:
@Value("张三")
private String name;
@Value("${username}")
private String username;