Spring学习笔记(IOC注解)

前言

基于注解的IOC配置和xml的IOC配置要实现的功能都是一样的,降低程序之间的耦合,只是配置的形式不一样。

首先在bean.xml里面还是要写一部分内容


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="SpringStudy">context:component-scan>
beans>

context标签告知Spring在创建容器时要扫描的包,配置所需要的标签不是在bean的约束中,而是一个名称为context名称空间和约束中

用于创建对象的:
他们的作用和在xml配置文件里编写一个标签实现的功能一样
@Component
作用:用于把当前类对象存入Spring容器中
属性:value:用于指定bean的id。但我们不写时他的默认值是当前类名(首字母小写)。

@Component
public class AccountServiceImpl implements IAccountService {

    private IAccountDao accountDao = new AccountDaoImpl();

    public void  saveAccount(){
        accountDao.saveAccount();
    }
}
public class Client {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        IAccountService as = (IAccountService)ac.getBean("accountServiceImpl");
        as.saveAccount();
    }
}

@Controller:一般用于表现层
@Service:一般用于业务层
@Repository:一般用于持久层
以上三个注解的作用和Component是一模一样的
他们三个是Spring框架为我们明确提供的三层使用的注解,使我们三层对象更加清晰
用于注入数据的:
他们的作用和在xml配置文件里编写一个标签实现的功能一样

Autowired:
作用:按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
如果IOC容器中没有一个对象类型和我们需要注入的类型匹配,则报错。
如果IOC容器里有多个个对象的类型都满足,首先按照类型找出匹配的对象集合,然后使用变量名称作为bean的id继续查找,如果有一样的也可以注入成功,如果都不一样就报错。
出现位置:可以是成员变量上,也可以是方法上。
细节:在使用注解时,set方法就不是必须的了。

@Component
public class AccountServiceImpl implements IAccountService {
    @Autowired
    private IAccountDao accountDao ;
    public void  saveAccount(){
        accountDao.saveAccount();
    }
}

这个时候注入就去找Spring容器里面有没有一个类型是IAccountDao类型的对象。

@Component
public class AccountDaoImpl implements IAccountDao {

我们在AccountDaoImpl里加入了注解,这里就可以找到这个对象,然后自动注入。

Qualifier:
作用:按照类型注入的基础上再按照名称注入。它在给类成员注入时不能单独使用,在给方法参数注入时可以。
属性:value,用于指定注入bean的id
必须与Autowired配合使用

@Autowired
    @Qualifier(value = "accountDao1")
    private IAccountDao accountDao ;

Resource
作用:直接按照bean的id注入,可以独立使用
属性:name,用于指定bean的id

@Resource(name = "accountDao1")
    private IAccountDao accountDao ;

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

Value
作用:用于注入基本类型和String类型
属性:value,用于指定数据的值,它可以使用Spring中的SpEL(Spring中得el表达式)
SpEl写法:${表达式}
用于改变作用范围的:
他们的作用和在bean标签里使用scope属性是一样的

Scope:
作用:指定bean的作用范围
属性:value:(singleton,prototype)
和生命周期相关:
他们的作用和在bean里面使用init-method和destroy-method的作用是一样的

PreDestroy
作用:指定销毁的方法
PostContruct
作用:用于指定初始化方法

替代bean.xml的注解

我们可以通过定义一个配置类,为它添加注解,使它的作用和bean.xml是一样的

1.Configuration
作用:指定当前类是一个配置类
2.ComponentScan
作用:用于通过注解指定Spring在创建容器时要扫描的包
属性:basepackage:用于指定创建容器时要扫描的包
相当于使用:

<context:component-scan base-package="SpringStudy">context:component-scan>

3.Bean
作用:把当前方法的返回值作为bean对象存入Spring容器里面
属性:name,用于指定bean的id,但不写时,默认值是当前方法的名称

    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
        <constructor-arg name="ds" ref="dataSource">constructor-arg>
    bean>

这个bean标签可以被替换为如下代码

    @Bean(name = "runner")
    public QueryRunner createQueryRunner(DataSource dataSource){
        return new QueryRunner(dataSource);
    }

bean前面的部分


<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
      https://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      https://www.springframework.org/schema/context/spring-context.xsd">

在得到容器的地方做一些修改即可
原来是

  ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

现在变为

 ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);

SpringConfiguration是我们的配置类

Import:
作用:用于导入其他配置类。把其他配置类加入主配置类里面

你可能感兴趣的:(JAVA)