SpringIOC随笔(七)- JavaConfig配置

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方式,各种各样的方式,合理搭配使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值