Spring IOC容器装配Bean_基于注解配置方式

本文内容纲要:

- bean的实例化

- bean属性的依赖注入

- 备注

bean的实例化

1.导入jar包(必不可少的)

Image

2.实例化bean

  • applicationContext.xml(xml的写法)

  • 注解的写法

第一种:在 applicationContext.xml中开启注解扫描(同时引入context命名空间)

<?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 https://www.springframework.org/schema/context/spring-context.xsd">

<!--开启注解扫描

context:component-scan 配置spring ioc容器开启注解扫描,扫描指定包下的@Component修饰的类,将这些类的对象创建交给spring ioc容器完成

base-package: 需要扫描哪些包(及其子包)

-->

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

</beans>

第二种:@Component、@Service、@Controller、@Repository 用于实例化bean

Spring3.0为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理

@Service、@Controller、@Repository是@Component衍生的子注解

  • @Repository用于标注数据访问组件(如DAO层组件)

  • @Service用于标注业务层组件(如Service层)

  • @Controller用于标注控制层组件(如struts中的action层)

  • @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注

    /*

    注解:添加在实现类上(思想同配置文件)

    @Component 等价于

    id:默认是类名(首字母小写) value:bean的id

    @Component(value = "userDao")

    @Component("userDao")

    */

    @Repository("userDao")

    public class UserDaoImpl implements IUserDao {

    public void select() {

    System.out.println("UserDao...select...");

    }

    }

bean属性的依赖注入

简单数据类型依赖注入

Spring3.0后,提供 @Value注解,可以完成简单数据的注入

/*

@Component

@Component(value="customerService")

@Service(value="customerService")

四者都等价

*/

@Service("customerService")

public class CustomerService {

    //简单类型的成员变量

    @Value("Rose")//参数的值简单类型

    private String name="Jack";

    //保存业务方法

    public void save(){

       System.out.println("CustomerService业务层被调用了。。。");

       System.out.println("name:"+name);

    }

}

复杂类型数据依赖注入

1.使用@Value 结合SpEL -- spring3.0 后用

@Service("userService")

public class UserServiceImpl implements IUserService {

/*<bean id="userDao" class="com.igeekhome.dao.impl.UserDao"> </bean>

@Value("#{bean的id}")

*/

//写法一 (在属性声明上面注入,底层自动还是生成setUserDao())

@Value("#{userDao}")

private UserDaoImpl userDao;

//写法二

@Value("#{userDao}")

public void setUserDao(UserDaoImpl userDao) {

this.userDao = userDao;

}

public void list() {

System.out.println("UserServiceImpl...list...");

userDao.select();

}

}

2.使用@Autowired 结合 @Qualifier

@Autowired:可以单独使用,如果单独使用,按照类型进行注入(会在spring ioc容器中查找类型为com.igeekhome.dao.impl.UserDaoImpl的bean并进行注入,如果找不到,肯定注入失败;如果找到匹配的单个bean,则注入成功; 如果找到多个相同类型的bean,则会选择其中一个bean进行注入

@Qualifier:与@Autowired结合,按照名称进行注入

@Autowired//默认按照类型注入的

@Qualifier("userDao")//必须配合@Autowired注解使用,根据名字注入

private UserDaoImpl userDao;

3.JSR-250标准(基于jdk) 提供注解@Resource

如果没有指定name属性,那么先按照名称(注解修饰的属性名)进行注入,在容器中查找bean的name/id为userDao的bean,如果找到,则注入成功。如果按照名称进行注入没有找到相对应的bean,那么就会使用按照类型进行装配,如果没有改类型,则注入失败,抛出异常;如果容器中存在单个该类型的bean,则注入成功;如果容器中存在多个相同类型bean,则注入失败(expected single matching bean but found 2: userDaoxxx,userDaox)

如果指定了name属性,那么就只会按照name进行注入

@Resource//(name="userDao")

private UserDaoImpl userDao;

4.JSR-330标准(jdk) 提供 @Inject和@Named注解(不推荐)

需要先导入 javax.inject 的 jar

使用@Inject,默认按照类型注入,使用@inject和@Named注解,则按照名称注入。用法与@Autowired 结合 @Qualifier 的用法一致

bean的初始化和销毁

1.applicationContext.xml 中的写法

<!--

init-method:指定初始化方法

destroy-method: 指定销毁触发方法

-->

<bean id="lifecycle" class="com.igeekhome.bean.LifeCycleBean" scope="singleton" init-method="initMethod" destroy-method="destroyMethod"></bean>

2.注解写法

使用 @PostConstruct 注解, 标明初始化方法 ---相当于 init-method 指定初始化方法

使用 @PreDestroy 注解, 标明销毁方法 ----相当于 destroy-method 指定对象销毁方法

@Repository("userDao")

public class UserDaoImpl implements IUserDao {

public void select() {

System.out.println("UserDao...select...");

}

//init-method

@PostConstruct

public void init() {

System.out.println("init...");

}

//destory-method

@PreDestroy

public void destory() {

System.out.println("destory");

}

}

bean的作用域

1.applicationContext.xml 中的写法

默认是 singleton 单例 ,prototype是多例

<bean id=”” class=”” scope=”prototype”>

2.注解写法

通过@Scope注解,指定Bean的作用域

@Service("userService")

//@Scope("singleton")默认是单列

@Scope("prototype")

public class UserServiceImpl implements IUserService { }

备注

只有在Spring配置文件中开启了注解扫描

才能使用 @Component @Autowired @Resource @PostConstruct @PreDestroy等注解

本文内容总结:bean的实例化,bean属性的依赖注入,备注,

原文链接:https://www.cnblogs.com/hublogs/p/11994886.html

以上是 Spring IOC容器装配Bean_基于注解配置方式 的全部内容, 来源链接: utcz.com/z/296212.html

回到顶部