Spring(二) 注解
Spring中常用注解介绍
Spring中的注解配置和xml配置要实现的功能是一样的
注解开发环境
引入maven坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
开启组件扫描
<context:component-scan base-package="com.itheima"/>
IOC注解说明
IOC注解都必须放在想要被IOC容器管理的类上:
- @Component 非三层模式范围的类上使用
意思就是告诉spring,利用这个类创建一个对象,并且将对象放到spring的IOC容器中。
相当于xml中的<bean id="accountDao" class=""/> 可以使用这种形式指定一个id,如果不指定默认为类名首字母小写
- @Controller 标注在表现层的类上
- @Service 标注在业务层的类上
- @Repository 标注在持久层的类上
bean对象作用域注解
- @Scope 用于指定bean的作用范围,相当于配置文件中的<bean scope=""/>
bean对象创建创建后和摧毁前触发行为
- @PostConstruct bean对象创建后触发行为
- @PreDestory bean对象摧毁前触发行为
<bean init-method="init" destroy-method="destory"/>
DI注解说明
DI注解都相当于直接给属性赋值,而无需借助于set方法或构造方法
-
@Autowired
-
放在属性上:
表示先按照类型给属性注入值【by type】
如果找到了,而且正好找到了一个,那么就就行依赖注入
如果IOC容器中存在多个与属性同类型的对象,则会按照属性名注入值【by name】
也可以配合@Qualifier("IOC容器中对象id")注解直接按照名称注入值
-
放在方法上:
- 表示自动执行当前方法
- 如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值,也可以在参数上添加
- 如果没有查到,就报错,如果找到了并且正好找到1个就进行注入如果找到了但是找到了多个,按照当前属性的名称和IOC容器中bean对象的id进行匹配
- @Qualifier("IOC容器中对象id")注解按照名称寻找对象给参数传值
-
-
@Resource(Java9以后废弃了)
只能放在属性上,表示先按照属性名匹配IOC容器中对象id给属性注入值【by name】
若没有成功,会继续根据当前属性的类型匹配IOC容器中同类型对象来注入值【by type】
若指定了name属性@Resource(name="对象id")则只能按照对象id注入值
-
@Value
用于简单数据类型的注入,相当于<property name="" value="">,此注解一般用于解析其他properties配置文件中的key值俩获取对应的value
测试案例
Spring配置文件applicationContext.xml配置
<!-- 配置注解扫描 配置扫描全部包-->
<context:component-scan base-package="com.itheima"/>
使用注解将dao放入容器
@Repository
public class AccountDaoImpl implements AccountDao
使用注解将service放入容器
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
测试
@Test
public void testFindAll() {
//启动Spring容器
ApplicationContext act =
new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService service = act.getBean(AccountService.class);
List<Account> accounts = service.findAll();
for (Account account : accounts) {
System.out.println(account);
}
}
Spring新注解
@Configuration
用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解,被这个标签标注的类,会在Spring容器启动的时候,自动加载
@Bean
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入Spring容器。它支持一个name属性,用于给生成的bean取一个id
Bean只能标注在方法上,用于将当前方法返回的对象,返回的对象放入Spring的IOC容器
可以使用@Bean(id)来指定当前对象在容器中的id,如果不指定,默认是当前方法的名称。
它还完全有@Autowired标注在方法上的作用
@ComponentScan
组件扫描注释,相当于xml配置文件中的<context:component-scan base-package=""/>
@PropertySource
用于加载.properties文件中的配置。
@Import
在一个配置类中引入其他配置
Spring纯注解开发
创建DBConfig
//自动加载配置
@Configuration
@PropertySource("db.properties")
public class DBConfig {
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String name;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.driver}")
private String driver;
@Bean("dataSource")
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setPassword(password);
dataSource.setUsername(name);
dataSource.setUrl(url);
return dataSource;
}
public QueryRunner getQueryRunner(@Qualifier("dataSource") DataSource dataSource) {
return new QueryRunner(dataSource);
}
}
创建java类作为配置类
@ComponentScan("com.itheima")
@Import(DBConfig.class)
public class SpringConfig {
}
测试
@Test
public void findByName() {
ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService service = act.getBean(AccountService.class);
Account account = service.findByName("test2");
System.out.println(account);
}
Spring整合Junit
引入坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
在测试类上使用@RunWith指定Spring的单元测试运行器
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJunitTest {
}
使用@ContextConfiguration指定配置文件,它支持文件和类的形式
//指定配置文件
@ContextConfiguration(classes = SpringConfig.class)
可以使用@Autowired直接注入需要的bean
@Autowired
private AccountService service;
@Test
public void testFindByName() {
System.out.println(service.findByName("test1").toString());
}
网友评论