基于注解的Spring

本文探讨了如何从Spring IoC容器中通过配置文件和注解两种方式获取数据,包括基于XML配置的bean管理和使用@Configuration注解的自动扫描规则,以及不同作用域的Bean实例化。还介绍了如何在三层组件中通过@ComponentScan进行定制化扫描和过滤。
摘要由CSDN通过智能技术生成
从SpringIOC容器中取数据
  • 基于配置文件的取数据方式:从applicationContext.xml中取数据,利用ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”)读取配置文件,利用getBean方法取出相应Bean:
    Studuent stu = (Student)context.getBean(“student”);
  • 基于注解的方式取数据方式:前提必须有相应的带有注解的配置类,从配置类中利用注解存入到IOC容器中才能将数据取出,利用ApplicationContext context = new AnnotationConfigApplicationContext(“MyConfig.class”)读取配置文件信息,其中MyConfig.class为配置类的class文件,利用getBean方法取出相应Bean:
    Studuent stu = (Student)context.getBean(“student”);
  • 通过配置文件applicationContext.xml存取Bean与通过注解方式存取Bean是相互独立的(两个不同的容器),存取要保持一致性,否则会存在取不到数据或取出错误数据的情况。
基于注解方式给IOC容器存放Bean
  • 前提必须存在带有@Configuration注解的配置类
基于三层组件的存放Bean方式
  • 三层组件类型:@Controller、@Service、@Repository、@Component

  • 操作步骤

    • 将三层组件分别在相应层级中标注

    • 将注解所在包,纳入IOC扫描器

      • 通过配置文件配置扫描器: 需要在applicationContext.xml中配置<context:component-scan base-package=“需要扫描的包,例如:indi.dsl.controller或者二级目录indi.dsl”></context:component-scan>
      • 通过注解形式配置扫描器:需要在带有@Configuration的配置类中,利用@ComponentScan(value=“需要扫描的包”),来配置扫描器
基于注解形式的扫描器应用
  • type=FilterType.ANNOTATION类型(三层中某一层类):

    • 在注解扫描器中排除三层中某个层:指定某个层被排除@ComponentScan(value=“需要扫描的包”,excludeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,value=Server.class)})
    • 只扫描指定的层,使用includeFilters并且必须搭配useDefaultFilters=“False”,屏蔽掉默认设置为true,只扫描指定的层级,如果不设置useDefaultFilters属性为False,则会将所有层级的注释扫描出来。
  • type=FilterType.ASSIGNABLE_TYPE类型,指定某一具体的类:

    • 排除时excludeFilters={@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,value=“某个具体的类,例如:StudentController.class”)})
    • 包含时includeFilters={@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,value=“某个具体的类,例如:StudentController.class”)})
  • type=FilterType.CUSTOM类型,自定义类型:需要自行定义类方法,并且该方法必须实现TypeFilter接口

    • 排除时excludeFilters={@ComponentScan.Filter(type=FilterType.CUSTOM,value={自行定义的方法,例如MyFilter.class)})
    • 包含时includeFilters={@ComponentScan.Filter(type=FilterType.CUSTOM,value={自行定义的方法,例如MyFilter.class)})
Bean的作用域
  • L如果不指定作用域的情况下,默认是singlton单例的,在IOC容器初始化时就是创建唯一的一个对象,在何时调用getBean方法时,取到的对象都是同一个,并且支持“懒加载”@Lazy,在调用时才会创建对象,初始化时不创建对象。
  • prototype原型模式即多实例,可以利用@scope(“prototype”)指定该Bean为多实例作用域,默认在调用时进行对象的创建。每次getBean时都会创建一个新的对象。
非三层组件的存放Bean方式
  • @Bean+方法的返回值
  • Improt方法在IOC容器中添加Bean:
    • 创建普通类,利用@Improt(自定义的普通类:例如Apple.class)
    • 自定义ImprotSelector接口的实现类,利用selectImprots()方法,将要存入的Bean全类名作为返回值返回,并用Improt(类名.class)告知程序识别该类。
    • 编写ImprotBeanDefinitionRegistra接口的实现类,重写其中方法并用Improt(类名.class)告知程序识别该类。
  • FactoryBean(工厂Bean)
  • 编写FactoryBean接口的实现类,重写其中方法,在取数据时getBean(“例如:ApplyBean”),取得是真正的AppleBean,如果getBean(“例如:&ApplyBean”),如果加入“&”符号,则是取得实现类的本身。
自动装配@Autowired
  • 自动装配@Autowired可以放在属性前,方法前,也可以放在参数中,起到自动装配的的作用,但是放在参数中,要求参数是复杂类型的,并且该参数的来源必须为@Bean+返回值存放在IOC容器中的。
  • 如果@Autowired单独使用,是按照类型进行装配的,如果@Autowired和qualifier(“别名”)一起使用,是按照别名的名称,进行装配的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值