Spring注解驱动开发之IOC

1、最简单的注解驱动开发实例:

      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.3.8.RELEASE</version>
      </dependency>
public class Student {
    String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void print(){
        System.out.println("student :" + name);
    }
    public Student() {
        System.out.println("student构造器");
    }
}

@Configuration
public class Config {
    @Bean
    public Student student(){
        System.out.println("创建student对象");
        Student s = new Student();
        s.setName("yaohuiqin");
        return s;
    }
}

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext=new AnnotationConfigApplicationContext(Config.class);
        Student s= (Student) annotationConfigApplicationContext.getBean(Student.class);
        System.out.println(s.getName());
        String[] strings=annotationConfigApplicationContext.getBeanDefinitionNames();
        for(String ss:strings){
            System.out.println(ss);
        }
    }
}

2、@ComponentScan注解 自动扫描  @Controller  @Service @Repository @Component

FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型
FilterType.CUSTOM :自定义类型
<context:component-scan base-package="com.test.spring"></context:component-scan>
@Configuration
@ComponentScan(value = "com.test.spring.config",includeFilters={
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = Service.class)
},useDefaultFilters =false)
public class Config {

}
public class MyTypeFilger implements TypeFilter {
    /**
     *
     * @param metadataReader 扫描到的当前的类的信息
     * @param metadataReaderFactory 可以获取其他类的信息
     * @return
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类的注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前扫描类的类型信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类的资源的信息
        Resource resource = metadataReader.getResource();
        String className = classMetadata.getClassName();
        System.out.println("测试"+className);
        if(className.contains("er"))return true;
        return false;
    }
}
@Configuration@ComponentScan(value = "com.test.spring.config",includeFilters={        @ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilger.class)},useDefaultFilters =false)public class config {  }

3、@Scope(value = "singleton")

singleton、prototype、request、session
@Lazy懒加载

[email protected](快速给容器导入一个组件)

@Import(value = {MyImportBeanDefinitionRegistrar.class,Dao.class})value值可以是bean的类,
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = new RootBeanDefinition(ByBeanDefinitionRegistrar.class);
        registry.registerBeanDefinition("ByBeanDefinitionRegistrar123",beanDefinition);
    }
}

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.test.spring.config.Dao","com.test.spring.config.Service"};
    }
}

5、@conditional使用实例

@Configuration
public class config2 {

    @Conditional(value = Linuxcondition.class)
    @Bean
    public Person yaohuiqin(){
        System.out.println("创建Person:yaohuiqin对象");
        Person s = new Person();
        s.setName("yaohuiqin");
        return s;
    }
}

public class Linuxcondition implements Condition  {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        ClassLoader classLoader = context.getClassLoader();
        Environment environment = context.getEnvironment();
        String currentOs = environment.getProperty("os.name");
        System.out.println(currentOs);
        if(currentOs.contains("Windows"))return true;
        return false;
    }
}

6、实现FactoryBean接口

public class NextDate implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        Date date = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, 1);
        date = calendar.getTime();
        return date;
    }
    @Override
    public Class<?> getObjectType() {
        return Date.class;
    }
    @Override
    public boolean isSingleton() {
        return false;
    }
}

7、指定初始化方法和销毁方法

@Bean(initMethod = "init",destroyMethod = "destory")    初始化和销毁方法指定。初始化方法是在对象创建完成并赋完值,则调初始化方法。销毁方法是在容器销毁时调用。

@PostConstruct

@PreDestroy

public class MyCat implements InitializingBean,DisposableBean {
    String name;
    public MyCat() {
        System.out.println("MyCat构造器");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        System.out.println("设置属性");
        this.name = name;
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("MyCat---InitializingBean----afterPropertiesSet()");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean---DisposableBean---destroy()");
    }
}

8、BeanPostProcessor接口

Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

源码:

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)      throws BeanCreationException {
populateBean(beanName, mbd, instanceWrapper);   //给bean进行属性赋值
if (exposedObject != null) {   exposedObject = initializeBean(beanName, exposedObject, mbd);}
}


9、@Value赋值
  值,#{},${}        #{20-2}

 <context:property-placeholder location="jdbc.properties"></context:property-placeholder>等价于在配置类上写:@PropertySource( value = "jdbc.properties")

10、自动装配

  @Autowired 优先使用类型去自动装配,如果存在多个,则将属性的名字作为id去查找装配。

  指定装配:

    @Qualifier("myDao2")    @Autowired    MyDao myDao3;   装配时首选装配:
    @Primary
  找不到就不装配 :
    @Autowired(required = false)


原文地址:https://www.cnblogs.com/yaohuiqin/p/9961900.html

时间: 2024-10-08 23:17:43

Spring注解驱动开发之IOC的相关文章

Spring注解驱动开发之AOP容器篇

前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@EnableXXX等.如果掌握这些底层原理.注解,那么我们对这些高层框架就能做到高度定制,使用的游刃有余 本篇主要内容:Spring AOP的使用及其原理分析 一.AOP功能测试 AOP[动态代理]:指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 步骤: 1.导入aop模块:Sp

Spring注解驱动开发之web

前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@EnableXXX等.如果掌握这些底层原理.注解,那么我们对这些高层框架就能做到高度定制,使用的游刃有余 一.servlet3.0规范 1.新增的注解支持 在servlet3.0之前的话,我们要添加Servlet.Filter.Listener都需要在web.xml中注册,而在servlet3.0添加了注

Spring 注解驱动(一)基本使用规则

Spring 注解驱动(一)基本使用规则 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.基本使用 @Configuration @ComponentScan(basePackages = "com.github.binarylei", excludeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})

Android驱动开发之Hello实例

Android驱动开发之Hello实例: 驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconfig modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p_defconfig modified:   kernel/drivers/input/misc/Kconfig modified:   kernel/drivers/input/

linux驱动开发之HelloWorld

最近实习,公司项目搞的是平板开发,而我分配的任务是将驱动加载到内核中. 准备工作,必要知识了解:加载有两种方式,一种是动态加载和卸载即模块加载,另一种是直接编译进入内核:Linux内核把驱动程序划分为3种类型:字符设备.块设备和网络设备.字符设备和块设备可以像文件一样被访问.它们的主要区别不在于能否seek,而是 在于系统对于这两种类型设备的管理方式.应用程序对于字符设备的每一个I/O操作,都会直接传递给系统内核对应的驱动程序:而应用程序对于块设备的操作, 要经过系统的缓冲区管理,间接传递给驱动

驱动开发之I2C总线

驱动开发之I2C总线: I2C:数据线和时钟线. 起始信号:时钟线为高电平,数据线由高到低跳变. 结束信号:时钟线为高电平,数据线由低到高跳变. 应答信号:第九个时钟周期,时钟线保持为高电平,数据线为低电平,此时为成功应答. 读写位:站在主机的角度考虑. 0代表主机给从机发送数据. 1代表主机接收从机的数据. 硬件原理: 数据帧的封装:主机给从机发送数据: 起始信号 + 7位从机地址 写位 + 从机给主机应答 + 主机给从机发送8位数据 + 从机给主机应答 ... + 主机给从机发送8位数据 +

Spring 注解驱动(二)WEB 注解开发

Spring 注解驱动(二)WEB 注解开发 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.基本使用 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 1.1 Servlet 3.0 注解 Servlet 3.0 常用注解: @WebServlet @WebFilter @WebInitParam @WebListener @WebServlet("/hello") pu

Spring注解驱动开发(一)--项目搭建

一. 前言 <Spring注解驱动开发>系列文章是基于Spring的4.3.11.RELEASE版本,通过注解的方式进行开发演示. 二. 项目搭建 1.依赖包引用 创建一个maven工程,引入相关的依赖包.我们以依赖最少的原则只引用spring-context和junit包. <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>s

Spring注解驱动开发(二)--组件注入

一.前言 上一篇我们搭建了一个简单的Spring项目,并简单的使用了 组件注册.这一篇中,我们来详细的讲解组件注入. 二.组件注入 1. @ComponentScan 在上一篇中,我们使用了@Configuration和@Bean实现了组件注入.但是如果需要注入的组件很多的情况下,每个组件都需要通过一个@Bean注解进行注入,这样就会很麻烦.所以Spring提供了@ComponentScan注解. @ComponentScan可以指定需要扫描的包,在这些包下,@Component注解标注的组件都