Spring中基于注解方式管理bean

操作步骤

第一步:导入相关jar包

spring IoC的基本包

Spring支持注解的Jar包

第二步:创建Spring配置文件,ApplicationContext.xml

引入约束和开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 开启注解扫描 
        到包里面扫描类、方法、属性上面是否有注解
    -->
    <context:component-scan base-package="cn.hao"></context:component-scan>
    
</beans>

第三步:使用注解方式实现bean管理

DAO层:

package cn.hao.dao;

import org.springframework.stereotype.Repository;

// 注解方式创建bean
@Repository
public class UserDAO {

    public void doAdd() {
        System.out.println("add......");
    }
}

Service层:

package cn.hao.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import cn.hao.dao.UserDAO;

// 注解方式创建bean
@Service
public class UserService {

    // 依赖注入
    @Resource
    private UserDAO userDAO;
    
    public void add() {
        this.userDAO.doAdd();
    }
}

测试类:

package cn.hao.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.hao.service.UserService;

public class Test {

    public static void main(String[] args) {
        
        // 加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 获取容器中的bean
        UserService userService = (UserService) context.getBean("userService");
        userService.add();
    }
}

创建Bean的的四种注解方式

1、@Component:标注一个普通的Spring Bean 类

2、@Controller:标注一个控制器组件类

3、@Service:标注一个业务逻辑组件类

4、@Repository:标注一个DAO组件类

// 指定该类作为Spring Bean,Bean的实例名为service
@Service("service")
public class UserService {
    //......
}

若创建的Bean实例的名称没指定,默认是Bean类的首字母小写,其他部分不变。

// 指定该类作为Spring Bean,Bean的实例名默认为userService
@Service
public class UserService {
    //......
}

指定Bean的作用域的二种注解方式

1、@Scope("singleton"):单例,不写默认就是这种方式

2、@Scope("prototype"):多例

@Service
@Scope("singleton")
public class UserService {

    // 依赖注入
    @Resource
    private UserDAO userDAO;
    
    public void add() {
        this.userDAO.doAdd();
    }
}

Bean中依赖注入的两种方式

1、@Resource

2、@Autowired

@Resource方式注入默认是按名称装配,即一旦设置了name属性,则严格按照名称进行查找装配,若没有对应的Bean,则装配失败。

@Service
public class UserService {

    // 在Spring容器中找到名称为userDAO的Bean实例注入
    @Resource(name="userDAO") 
    private UserDAO userDAO;
    
    public void add() {
        this.userDAO.doAdd();
    }
}

注:如果没有指定name属性,默认的名称和注入的对象名称一样。若仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 

@Service
public class UserService {

    // 没有给出name属性,默认名称与要注入的属性名称一样,即userDAO
    @Resource
    private UserDAO userDAO;
    
    public void add() {
        this.userDAO.doAdd();
    }
}

@Autowired 默认按类型装配(byType), 例如,@Autowired标注了private UserDAO userDAO,则Spring会自动搜索容器中类型为UserDAO的Bean进行注入。

@Service
public class UserService {

    // 在容器中搜索类型是UserDAO的实例对象装配
    @Autowired
    private UserDAO userDAO;
    
    public void add() {
        this.userDAO.doAdd();
    }
}

但是按类型装配有个很大的缺陷是,如果容器中有不止一个UserDAO类型的实例,则无法正确装配,会抛出异常。可以配合@Qualifier注解,实现按名称装配的效果。

@Service
public class UserService {

    // 两者结合实现按名称装配的效果
    @Autowired
    @Qualifier("userDAO")
    private UserDAO userDAO;
    
    public void add() {
        this.userDAO.doAdd();
    }
}

猜你喜欢

转载自www.cnblogs.com/binaway/p/8906576.html