定义一个bean
@Component
public class Car implements Serializable {
public void drive(){
System.out.println("I'm driving this car");
}
}
定义一个组件扫描类
@Configuration
@ComponentScan
public class CarConfig {
}
@Configuration
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
与@Bean注解的使用:
@Configuration
public class Config {
public Config() {
System.out.println("TestConfig容器初始化...");
}
@Bean(name = "getMyCar")
public Car getCar() {
Car c = new Car();
c.setName("dankun");
return c;
}
}
@ComponentScan 能够在Sprnig中启用组件扫描。如果没有其他配置的话, @ComponentScan默认会扫描与配置类相同的包。 Spring将会扫描这个包以及这个包下的所有子包,查找带有 @Component注解的类。使用value指定路径
@ComponentScan(value = "com.jhr")
作用类似:
<context:component-scan base-package="com.jhr.*"></context:component-scan>
扫描多个包: @ComponentScan(basePackages = {"com.jhr","com.oracle"})
扫描多个类或接口: @ComponentScan(basePackageClasses = {Car.class,Bus.class})
在测试类中加载bean
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes =CarConfig.class)
public class BeantestApplicationTests {
@Autowired
private Car car;
@Test
public void contextLoads() {
car.drive();
}
}
@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件
加载单个文件:
@ContextConfiguration(locations="../applicationContext.xml")
@ContextConfiguration(classes = SimpleConfiguration.class)
加载多个文件:
@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })
总结
- @Configuation等价于
<Beans></Beans>
- @Bean 等价于
<Bean></Bean>
- @Component 等价于
<Bean></Bean>
- @ComponentScan等价于
<context:component-scan base-package="com.jhr"/>
关于@Named、@Inject
大多数场景下可与spring注解替换
Spring 注解 | java 依赖注入规范 |
@Component | @Named |
@Autowired | @Inject |
关于@Bean注解
@Bean注解主要用在@Component或者@Component衍生的注解(@Configuration、@Service、@Controller等)
例如 springboot 中
1. 定义一个Configuration类,并添加bean
@Configuration
public class CarConfiguration {
public CarConfiguration() {
System.out.println("CarConfiguration ***************************初始化");
}
@Bean(name = "getMyCar")
public Car getCar() {
Car c = new Car();
c.setName("dankun");
return c;
}
}
2. 在测试类中 使用自动装配
@Autowired
private CarConfiguration carConfiguration;
@Test
public void getCarName(){
Car car = carConfiguration.getCar();
System.out.println("****************************");
System.out.println(car.getName());
}
运行结果:
详情可查看:
https://blog.youkuaiyun.com/IPI715718/article/details/82701072
在配置中引入其他配置
引用xml文件的操作方式:
<!-- Spring中引入其他配置文件 -->
<import resource="classpath*:/spring/job-timer.xml" />
引用properties 文件
<!--方式1 -->
<!--引入数据库配置信息 -->
<context:property-placeholder location="classpath*:properties/db.properties" />
<!--方式2 情况1配置一个:-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath*:db/jdbc.properties" />
</bean>
<!--方式2 情况1配置多个:-->
<bean id="propertyConfigure" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/opt/demo/config/demo-db.properties</value>
<value>classpath:/opt/demo/config/demo-db2.properties</value>
</list>
</property>
</bean>
引用 java类的方式
@Configuration
@Import(Car.class)
@ImportResource("classpath:car-conf.xml")
public class NewCar {
}
概述:
@Import注解是引入带有@Configuration的java类。
@ImportResource是引入spring配置文件.xml