spring系列

03 基于注解的IOC

2020-04-26  本文已影响0人  better_future
使用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);
上一篇下一篇

猜你喜欢

热点阅读