SpringIOC随笔(七)- JavaConfig配置

缺乏、安全感 2022-12-16 14:25 252阅读 0赞

SpringIOC随笔(七)- JavaConfig配置

之前已经提到了xml配置和使用注解的方式,虽说使用注解的配置方式方便很多,但是很多东西都是没办法使用注解的方式实现,例如一些jar包里的东西,这时候就需要使用到JavaConfig的配置方式,或者xml的方式实现。

@Configuration和@Bean注解。

  • @Configuration注解。

    • @Target(ElementType.TYPE)//只能用在类、接口或enum上
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Component
      public @interface Configuration {
  1. String value() default "";
  2. }
  3. * 这个注解表示这个类为JavaConfig
  • @Bean注解

    • @Target({
      1. ElementType.METHOD, ElementType.ANNOTATION_TYPE})//只能用在方法和注解上
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface Bean {
  1. @AliasFor("name")
  2. String[] value() default {
  3. };
  4. @AliasFor("value")
  5. String[] name() default {
  6. };
  7. Autowire autowire() default Autowire.NO;
  8. String initMethod() default "";
  9. String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
  10. }
  11. * 这个注解表示这个方法为创建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 = {

      1. com.fxyh.spring.ioc.Department.class})

      @PropertySources(value = {

      1. @PropertySource(value = {
      2. "classpath:config.properties", "classpath:jdbc.properties"})})

      @ImportResource(value = {

      1. "classpath*:applicationContext-*.xml"})

      public class AppConfig {

  1. @Value("${username}")
  2. private String username;
  3. @Bean()
  4. @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
  5. public User user() {
  6. User user = new User();
  7. System.out.println(username);
  8. user.setUsername("zhangsan");
  9. user.setPassword("123456");
  10. user.setAge(22);
  11. return user;
  12. }
  13. @Bean
  14. public UserService userService() {
  15. UserServiceImpl userService = new UserServiceImpl();
  16. userService.setUserDao(userDao());
  17. return userService;
  18. }
  19. @Bean
  20. public UserDao userDao() {
  21. UserDaoImpl userDao = new UserDaoImpl();
  22. return userDao;
  23. }
  24. }
  25. * applicationContext-bean.xml
  26. <?xml version="1.0" encoding="UTF-8"?>
  27. <beans xmlns="http://www.springframework.org/schema/beans"
  28. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  29. xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
  30. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  31. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
  32. <!--<context:property-placeholder location="classpath*:config.properties"/>-->
  33. <!--<context:component-scan base-package="com.fxyh.spring.config"/>-->
  34. <bean id="importXMLDemo" class="com.fxyh.ImportXMLDemo"/>
  35. </beans>
  36. * public class AppConfigTest {
  37. private AbstractApplicationContext context;
  38. private User user;
  39. private User user2;
  40. private Department department;
  41. private UserService userService;
  42. @Before
  43. public void setUp() {
  44. this.context = new AnnotationConfigApplicationContext(AppConfig.class);
  45. // this.context = new AnnotationConfigApplicationContext("com.fxyh.spring.config");
  46. // this.context = new ClassPathXmlApplicationContext("classpath*:applicationContext-bean.xml");
  47. this.user = this.context.getBean(User.class);
  48. this.user2 = this.context.getBean(User.class);
  49. this.department = this.context.getBean(Department.class);
  50. this.userService = (UserService) this.context.getBean("userService");
  51. }
  52. @Test
  53. public void test() {
  54. System.out.println(department);
  55. ImportXMLDemo bean = this.context.getBean(ImportXMLDemo.class);
  56. System.out.println(bean);
  57. String[] beanDefinitionNames = this.context.getBeanDefinitionNames();
  58. for (String beanDefinitionName : beanDefinitionNames) {
  59. System.out.println("beanName:" + beanDefinitionName);
  60. }
  61. System.out.println(this.user);
  62. System.out.println(user == user2);
  63. this.userService.addUser(this.user);
  64. }
  65. @After
  66. public void after(){
  67. this.context.close();
  68. }
  69. }
  • 这里test类中可以看到我有几行代码注释了,其实不仅仅可以用new AnnotationConfigApplicationContext(AppConfig.class);来获取上下文,还可以使用new AnnotationConfigApplicationContext(“包路径”);扫描对应的包来获取上下文,或者使用new ClassPathXmlApplicationContext(“classpath*:applicationContext-bean.xml”);的方式来获取上下文,也可以结合三种方式一起使用,不仅仅只能单一的方式,例如:在xml中使用扫描包,配置bean方式,各种各样的方式,合理搭配使用。

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读