SpringIOC随笔(七)- JavaConfig配置
之前已经提到了xml配置和使用注解的方式,虽说使用注解的配置方式方便很多,但是很多东西都是没办法使用注解的方式实现,例如一些jar包里的东西,这时候就需要使用到JavaConfig的配置方式,或者xml的方式实现。
@Configuration和@Bean注解。
-
@Configuration注解。
-
@Target(ElementType.TYPE)//只能用在类、接口或enum上 @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration { String value() default ""; }
-
这个注解表示这个类为JavaConfig类
-
-
@Bean注解
-
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})//只能用在方法和注解上 @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Bean { @AliasFor("name") String[] value() default {}; @AliasFor("value") String[] name() default {}; Autowire autowire() default Autowire.NO; String initMethod() default ""; String destroyMethod() default AbstractBeanDefinition.INFER_METHOD; }
-
这个注解表示这个方法为创建bean的方法。
-
-
@ComponentScan注解
- 这个注解的value为字符串数组,这里配置为扫描哪些包下的Bean组件。
-
@Import注解
- 这个注解的value为class数组,这里会把数组中的class注册成Bean组件。
-
@PropertySource和@PropertySources注解
- @PropertySources注解的value为@PropertySource数组
- @PropertySource的value为字符串数组,里面存properties文件的路径
- 如:
@PropertySources(value = {@PropertySource(value = {"classpath:config.properties","classpath:jdbc.properties"})})
- 这里要注意的是@PropertySource的路径不能使用classpath:,只能具体到某个文件*
-
@ImportResource注解
- 这个注解用于引入Spring的配置文件
- 如:
@ImportResource(value = {"classpath*:applicationContext-*.xml"})
-
例子:
-
import com.fxyh.spring.dao.UserDao; import com.fxyh.spring.dao.impl.UserDaoImpl; import com.fxyh.spring.ioc.User; import com.fxyh.spring.service.UserService; import com.fxyh.spring.service.impl.UserServiceImpl; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.*; @Configuration @ComponentScan(value = "com.fxyh.spring") @Import(value = {com.fxyh.spring.ioc.Department.class}) @PropertySources(value = {@PropertySource(value = {"classpath:config.properties", "classpath:jdbc.properties"})}) @ImportResource(value = {"classpath*:applicationContext-*.xml"}) public class AppConfig { @Value("${username}") private String username; @Bean() @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) public User user() { User user = new User(); System.out.println(username); user.setUsername("zhangsan"); user.setPassword("123456"); user.setAge(22); return user; } @Bean public UserService userService() { UserServiceImpl userService = new UserServiceImpl(); userService.setUserDao(userDao()); return userService; } @Bean public UserDao userDao() { UserDaoImpl userDao = new UserDaoImpl(); return userDao; } }
-
applicationContext-bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> <!--<context:property-placeholder location="classpath*:config.properties"/>--> <!--<context:component-scan base-package="com.fxyh.spring.config"/>--> <bean id="importXMLDemo" class="com.fxyh.ImportXMLDemo"/> </beans>
-
public class AppConfigTest { private AbstractApplicationContext context; private User user; private User user2; private Department department; private UserService userService; @Before public void setUp() { this.context = new AnnotationConfigApplicationContext(AppConfig.class); // this.context = new AnnotationConfigApplicationContext("com.fxyh.spring.config"); // this.context = new ClassPathXmlApplicationContext("classpath*:applicationContext-bean.xml"); this.user = this.context.getBean(User.class); this.user2 = this.context.getBean(User.class); this.department = this.context.getBean(Department.class); this.userService = (UserService) this.context.getBean("userService"); } @Test public void test() { System.out.println(department); ImportXMLDemo bean = this.context.getBean(ImportXMLDemo.class); System.out.println(bean); String[] beanDefinitionNames = this.context.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println("beanName:" + beanDefinitionName); } System.out.println(this.user); System.out.println(user == user2); this.userService.addUser(this.user); } @After public void after(){ this.context.close(); } }
-
-
这里test类中可以看到我有几行代码注释了,其实不仅仅可以用new AnnotationConfigApplicationContext(AppConfig.class);来获取上下文,还可以使用new AnnotationConfigApplicationContext(“包路径”);扫描对应的包来获取上下文,或者使用new ClassPathXmlApplicationContext(“classpath*:applicationContext-bean.xml”);的方式来获取上下文,也可以结合三种方式一起使用,不仅仅只能单一的方式,例如:在xml中使用<context:component-scan base-package=“com.fxyh.spring.config”/>扫描包,配置bean方式,各种各样的方式,合理搭配使用。