Spring-以注解的方式玩IOC

 2023-01-25
原文作者:一条小白白啊 原文地址:https://juejin.cn/post/7031831116403343368

由XML转向注解开发!

      我们之前是使用XML的方式来让Spring帮我们创建对象的,这样看起来非常麻烦,那么我们有没有什么简单的方式呢,答案是有的。

接下来我来告诉大家注解是怎么一步一步的取代xml配置的

第一步:在xml文件中告诉Spring要扫描的包,这样注解才会生效

    <context:component-scan base-package="com.albb"/>

第二步:Bean标签创建对象通过以下注解取代

    @Component 用在类上,相当于是Bean标签,id就是该类的类名首字母小写
        @Controller 用在web层上,相当于是Bean标签
        @Service  用在Service层上,相当于是Bean标签
        @Repository 用在dao层,配置一个Bean
        
        @Contorller,@Service,@Repository都相当于是@Component衍生出来的注解
        
        @Scope:配置Bean的作用范围,相当于bean的scope属性,用在类上
        @PostConstruct是指bean的初始化方法,用在初始化方法头上
        @PreDestory是指定bean的销毁方法,用在销毁方法上

第三步:依赖注入的注解

    @AutoWired 相当于<property name="" ref="" ></property>
    @Qualifer(要注入的bean的名称) 结合AutoWired使用,可以设置它的属性id,然后通过id来注入依赖
    @Resource(要注入的bean的名称):相当于@autoWired+@Qualifer
    @Value(普通值)
    @Value("${properties里的key}")
    相当于property标签的value,注入普通属性<Property name="" value=""> </Property>
    
    使用注解注入时,不需要使用set方法

纯注解开发

    1.创建一个配置类,打上@Configuration注解,
    2.@CompoentScan(包名),用在配置类上,表示开启注解扫描
    3.@ProperSource(配置文件),用在配置类上,加载properties文件,使用value属性指定properties的指定路径
    4.@Import 用在配置类上,引入子配置类,用value属性指定子配置类的class
    5.@Bean 用在配置类的方法上,把返回值声明为一个Bean,用name/value属性指定bean的id
      /*
            3.使用@Bean注解标记的方法,方法内部需要用到spring工厂(容器)里面的某一个对象,怎么办?
                3.1 此时可以在方法的参数上,写上想要的对象参数即可
                    a. 其实它就是在方法参数的前面,隐藏着一个注解: @Autowired
                3.2 但是也要考虑出现极端的情况:如果在spring的容器里面,有多个对象满足这个参数的类型,咋办?
                    a. 搭配使用@Qualifier ,指定id值。
                    b. 投机取巧,把方法的参数名字,写成id的名字即可
    
         */
        @Bean
        public QueryRunner runner03(@Qualifier("dataSource") DataSource ds){
            System.out.println("ds===" + ds);
            return new QueryRunner(ds);
        }
    
        @Bean
        public QueryRunner runner04(DataSource dataSource2){
            System.out.println("dataSource2===" + dataSource2);
            return new QueryRunner(dataSource2);
        }
    
        @Bean
        public DataSource dataSource() throws PropertyVetoException {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driverClass);
            ds.setJdbcUrl(jdbcUrl);
            ds.setUser(user);
            ds.setPassword(password);
            return ds;
        }
       @Bean
        public DataSource dataSource2() throws PropertyVetoException {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driverClass);
            ds.setJdbcUrl(jdbcUrl);
            ds.setUser(user);
            ds.setPassword(password);
            return ds;
        }
    }