用于把当前类对象存入spring容器中
属性:value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。
以上三个注解他们的作用和属性与Component是一模一样。
他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰。
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 描述:测试注解bean
* @author: myx
* @date: 2019/1/10
* 注意:本内容仅限于学习使用
* Copyright © 2019-myx. All rights reserved.
*/
public class Test {
public static void main(String[] args) {
/**
* 【ApplicationContext 接口的实现类 】
(1)ClassPathXmlApplicationContext:
它是从类的根路径下加载配置文件 推荐使用这种
(2)FileSystemXmlApplicationContext:
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。注意磁盘的权限
(3)AnnotationConfigApplicationContext:
当我们使用注解配置容器对象时,需要使用此类来创建spring 容器。它用来读取注解。
*/
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloSpringAnn bean = ac.getBean(HelloSpringAnn.class);
System.out.println(bean);
}
}
自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功,如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错,如果Ioc容器中有多个类型匹配时:
先按照类型匹配,如果不能匹配上,会按照属性的名称进行匹配
出现位置:可以是变量上,也可以是set方法上
细节:在使用注解注入时,set方法就不是必须的了。
注入集合
第一步:
@Bean
Public List createList(){
// 组织数据
List list = new ArrayList();
return list;
}
第二步:
@Autowired
private List list;
在按照类中注入的基础之上再按照名称注入。
属性:value:用于指定注入bean的id。
直接按照bean的id注入。如果id属性不存在,可以再按照类型注入。它可以独立使用
属性:name:用于指定bean的id,如果指定name,只能按照bean的id注入,不能按照类型注入。
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现(使用@Value)
用于注入基本类型和String类型的数据
属性:value:用于指定数据的值。使用${表达式}可以读取配置文件(.properties文件)的信息
@Value(value = "myx")
private String name;
@Value(value = "18")
private Integer age;
区别
用于指定bean的作用范围
属性:value:指定范围的取值。常用取值:singleton prototype
@PostConstruct
public void init(){
System.out.println("初始化方法执行了");
}
@PreDestroy
public void destroy(){
System.out.println("销毁方法执行了");
}
使用import加载多个applicationContext.xml
让程序加载多个spring的配置文件,对spring的配置文件细分
表示该类是一个配置类,它的作用和applicationContext.xml是一样的
@Configuration
@ComponentScan(value = {"com.myx"})
public class SpringConfiguration {
}
作用:指定当前类是一个配置类,如同applicationContext.xml中的配置
细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
用于通过注解指定spring在创建容器时要扫描的包
属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包的范围。
我们使用此注解就等同于在xml中配置了:
用于把当前方法的返回值作为bean对象存入spring的ioc容器中.
属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称
依赖注入细节:
我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象,如果有bean对象,将对象通过方法的形参注入到方法中使用。查找的方式和Autowired注解的作用是一样的
/**
* 创建数据源对象
* @return
*/
@Bean(name="ds")
public DataSource createDataSource(){
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/itcastspring");
ds.setUser("root");
ds.setPassword("root");
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
public class AccountServiceTest {
@Test
public void testFindAll() {
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
HelloSpringAnn bean = ac.getBean(HelloSpringAnn.class);
System.out.println(bean);
}
}
用于导入其他的配置类
属性:value:用于指定其他配置类的字节码。
当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
相当于:
applicationContext.xml中的
public class JdbcConfig {
/**
* 用于创建一个QueryRunner对象
* @param dataSource
* @return
*/
@Bean(name="runner")
@Scope("prototype")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
/**
* 创建数据源对象
* @return
*/
@Bean(name="ds")
public DataSource createDataSource(){
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/itcastspring");
ds.setUser("root");
ds.setPassword("root");
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
@ComponentScan(value = {"com.nyx"})
@Import(value= JdbcConfig.class)
public class SpringConfiguration {
}
用于指定properties文件的位置
属性:value:指定文件的名称和路径。关键字:classpath,表示类路径下
@ComponentScan(value = {"com.myx"})
@Import(value= JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
}
如果spring容器中出现了多个数据源类型,使用该注解指定注入的数据源。
@Bean(name="runner")
@Scope("prototype")
public QueryRunner createQueryRunner(@Qualifier(value = "ds2") DataSource dataSource){
return new QueryRunner(dataSource);
}
org.springframework
spring-test
5.0.2.RELEASE
junit
junit
4.12
/**
* 使用Junit单元测试:测试我们的配置
* Spring整合junit的配置
* 1、导入spring整合junit的jar(坐标)
* 2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
* @Runwith
* 3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
* @ContextConfiguration
* locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
* classes:指定注解类所在地位置
*
* 当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {
@Autowired
private AccountService as;
@Test
public void testFindAll() {
//3.执行方法
List accounts = as.findAllAccount();
for(Account account : accounts){
System.out.println(account);
}
}
}