美文网首页spring系列
03 基于注解的IOC

03 基于注解的IOC

作者: better_future | 来源:发表于2020-04-26 15:39 被阅读0次
    使用xml注解的时候 xml的配置
    <bean id="accountService" class="com.it.service.impl.AccountServiceImpl"
        scope="" init-method="" destroy-method="" >
            <property name="" value="" | ref=""></property>
    </bean>
    

    1) 用于创建对象的

    和在xml配置文件中编写一个<bean>标签实现功能是一样的
    @component
    作用:用于把当前类对象存入spring容器中,放在类上部
    属性: @component(value=""):用于指定bean的id,当我们不写时,默认值是当前类名,且首字母改小写

    @Controller:一般用于表现层
    @Service:一般用在业务层
    @Repository:一般用在持久层
    以上三个是spring框架为我们提供明确的三层使用注解,使三层对象更加清晰

    2) 用于注入数据的

    <property>标签的作用是一样的
    @Autowired 自动按照类型注入,只要容器中有唯一的一个bean对象类型与要注入的变量类型匹配,就可以注入成功。
    出现位置: 变量、方法上

    image.png
    @Qualifier
    作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以
    属性:vlaue:用于指定注入bean的id
    必须和Autowired配合使用
    image.png
    @Resource
    作用:直接按照bean的id注入。可以独立使用

    以上三个注入都只能注入其他bean类型的数据,而基本数据类型和String类型无法使用上述注解实现。
    另外,集合类型的注入只能通过XML来实现


    @Value
    作用:用于注入基本类型和String类型的数据
    属性:value用于指定数据的值,可以使用spring中SpEL(spring的EL表达式)
    SpEl的写法:${表达式}

    用于改变作用范围的 @ Scope

    相当于:<bean id="" class="" scope="">
    

    @Scope
    作用:用于指定bean的作用范围
    属性: value:指定范围取值,常用取值 singleton prototype request session globalsession

    和生命周期相关的 @PreDestroy @PostConstruct

    相当于:<bean id="" class="" init-method="" destroy-method="" />
    

    与xml中bean的init-method destroy-method 相似
    @ PreDestroy:用于指定销毁方法
    @ PostConstruct:用于指定初始化方法


    image.png

    spring 的纯注解配置

    @Configuration
    作用:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。
    属性:value:用于指定配置类的字节码

    @Configuration
    public class SpringConfiguration {  
    }
    

    我们已经把配置文件用类来代替了,但是如何配置创建容器时要扫描的包呢(通过扫描包中类上的容器注解 进行对象创建)?

    @ComponentScan
    用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
    <context:component-scan base-package="com.it"/>是一样的。

    @Configuration
    @ComponentScan("com.it")
    public class SpringConfiguration {
    }
    

    我们已经配置好了要扫描的包,但是数据源和 JdbcTemplate 对象如何从配置文件中移除呢?

    @Bean
    该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
    name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)

    public class JdbcConfig {
    /**
    * 创建一个数据源,并存入 spring 容器中
    * @return
    */
    @Bean(name="dataSource")
    public DataSource createDataSource() {
          try {
             ComboPooledDataSource ds = new ComboPooledDataSource();
             ds.setUser("root");
             ds.setPassword("1234");
             ds.setDriverClass("com.mysql.jdbc.Driver");
             ds.setJdbcUrl("jdbc:mysql:///spring_day02");
             return ds;
             } catch (Exception e) {
             throw new RuntimeException(e);
          }
    } 
    /**
    * 创建一个 DBAssit,并且也存入 spring 容器中
    * @param dataSource
    * @return
    */
    @Bean(name="dbAssit")
    public DBAssit createDBAssit(DataSource dataSource) {
          return new DBAssit(dataSource);
        }
    }
    

    我们已经把数据源和 DBAssit 从配置文件中移除了,此时可以删除 bean.xml 了。
    但是由于没有了配置文件,创建数据源的配置又都写死在类中了。如何把它们配置出来呢?
    请看下一个注解。

    @PropertySource
    用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到
    properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。

    属性:value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:

    @PropertySource(value = "classpath:jdbc.properties")
    public class JdbcConfig {
        @Value("${jdbc.driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
        /**
        * 创建一个数据源,并存入 spring 容器中
        * @return
        */
        @Bean(name="dataSource")
        public DataSource createDataSource() {
         try {
                ComboPooledDataSource ds = new ComboPooledDataSource();
                ds.setDriverClass(driver);
                ds.setJdbcUrl(url);
                ds.setUser(username);
                ds.setPassword(password);
                return ds;
        } catch (Exception e) {
            throw new RuntimeException(e);
            }
        } 
    }
    

    jdbc.properties 文件

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/day44_ee247_spring
    jdbc.username=root
    jdbc.password=1234
    

    此时我们已经有了两个配置类,但是他们还没有关系。如何建立他们的关系呢?
    请看下一个注解

    @Import 导入配置类

    @Configuration
    @ComponentScan(basePackages = "com.it")
    @Import({ JdbcConfig.class})  //导入
    public class SpringConfiguration {
    }
    
    @Configuration
    @PropertySource("classpath:jdbc.properties")
    public class JdbcConfig{
    }
    

    我们已经把要配置的都配置好了,但是新的问题产生了,由于没有配置文件了,如何获取容器呢?

    通过注解获取容器
    ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
    

    相关文章

      网友评论

        本文标题:03 基于注解的IOC

        本文链接:https://www.haomeiwen.com/subject/rrxrwhtx.html