JavaEE Bean装配方式——基于注解的装配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40788630/article/details/82812888

在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但是如果应用中有很多Bean将会使XML过于臃肿,给后续的维护和升级带来很大困难,为此Spring提供了对Annotation(注解)技术的全面支持,(注解也是Spring中实现Bean装配时最经常使用的)

Spring中定义了一系列的注解,常用的注解如下所示

@Component 可以使用此注解描述Spring中的Bean,但他是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可
@Repository 用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同
@Service 通常作用在业务层(Service层),用于将业务层的类表示为Spring中的Bean,其功能与@Component相同
@Controller 通常作用在控制层(Controller层),用于将业务层的类表示为Spring中的Bean,其功能与@Component相同
@Autowired 用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成对Bean的自动配置工作,默认按照Bean的类型进行装配
@Resource 其作用与@Autowired一样
@Qualifier 与@Autowired配合使用

为了更加直观的感受不同注解的作用,下面我们通过一个案例来演示如何通过注解来装配Bean

1、在chapter02项目的src目录下创建一个com.itheima.annotation包,在该包中创建接口UserDao,并在接口中定义一个save方法,如下面代码所示:

package com.itheima.annotation;

public interface UserDao {
	public void save();

}

2、在该包中创建接口UserDao的实现类UserDaoImpl,并实现接口的save方法,如下面代码所示:

package com.itheima.annotation;
import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDaoImpl implements UserDao {

	public void save() {
		System.out.println("userdao,,,,,,save,,,,,,");

	}

}

在上面的代码中首次使用了@Repository注解将UserDaoImpl类标识为Spring中的Bean,其写法相当于在配置文件中加入

<bean id="userDao" class="com.itheima.annotation.UserDaoImpl" />

然后在save方法中输出打印的一句话,验证是否成功调用了该方法

3、在com.itheima.annotation包中创建接口UserService,并在接口中定义一个save方法,如下面代码所示:

package com.itheima.annotation;

public interface UserService {

	public void save();
}

4、在该包中创建接口UserService的实现类UserServiceImpl,并实现接口的save方法,如下面代码所示:

package com.itheima.annotation;

import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")

public class UserServiceImpl implements UserService {

	@Resource(name="userDao")
	private UserDao userDao;
	
	public void save() {
		this.userDao.save();
		System.out.println("userservice,,,,,,,,,,save,,,,,");

	}

}

在上面的代码中首先使用@Service注解将UserServiceImpl类标识为Spring中的Bean,这相当于在配置文件中

<bean id="userServiceI" class="com.itheima.annotation.UserServiceImpl" />,然后使用@Resource注解标注在属性userDao上,在相当于在配置文件中加入 <property name="userDao" ref="userDao"/>

5、在com.itheima.annotation包中创建控制器类UserController,编辑后如下面代码所示:

package com.itheima.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;

@Controller("userController")

public class UserController {
	@Resource(name="userService")
	private UserService userService;
	public void save() {
		this.userService.save();
		System.out.println("userController,,,,,,,,save,,,,,,,");
	}

}

在上面的代码中首先使用@Controller注解将UserController类标识为Spring中的Bean,这相当于在配置文件中

<bean id="userController" class="com.itheima.annotation.UserController" />,然后使用@Resource注解标注在属性userService上,在相当于在配置文件中加入 <property name="userService" ref="userService"/>

6、在com.itheima.annotation包中,创建配置文件beans6.xml,在配置文件中编写基于Annotation装配的代码,代码如下:

<?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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
        
        <!-- 使用context命名空间,在配置文件中开启相应的注解处理器 -->
        <context:annotation-config/>
        <bean id="userDao" class="com.itheima.annotation.UserDao" />
        <bean id="userService" class="com.itheima.annotation.UserService" />
        <bean id="userController" class="com.itheima.annotation.UserController" />
        
</beans>

首先通过配置<context:annotation-config>来开启注解处理器,最后分别定义了3个Bean对应编写的3个实例。与XML装配方式不同的是,这里不再需要property

在上述Spring配置文件中的注解方式虽然大大简化了XML文件中的Bean的配置,但是仍需一一将配置对应的Bean配置,为此Spring提供了另一种更加高效的注解配置方式,

<context:component-scan base-backage="Bean所在包的路径" />

可以将上述beans6.xml中10-14行替换为:

<context:component-scan base-backage="com.itheima.annotation" />

!!!!!另外,使用上述代码进行替换时,必须在项目中导入Spring的AOP的jar包,否则程序会运行出错

7、在com.itheima.annotation包中,创建测试类AnnotationAssembleTest,在类中编写测试方法并定义配置文件的路径,然后通过Spring容器加载配置文件并获取UserController实例,最后调用save方法,代码如下所示:

package com.itheima.annotation;

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

public class AnnotationAssembleTest {

	private static ApplicationContext beanlizi;

	public static void main(String[] args) {
		String xmlPath = "com/itheima/annotation/beans6.xml";
		beanlizi = new ClassPathXmlApplicationContext(xmlPath);
		
		UserController userController = (UserController) beanlizi.getBean("userController");
		userController.save();
		
	}

}

执行程序后结果如下图所示:

从上图中我们可以看到Spring容器已经成功获取了UserController实例,并在通过调用实例中的方法依次执行了各层的输出语句,这说明基于Annotation装配Bean已经成功实现了

猜你喜欢

转载自blog.csdn.net/qq_40788630/article/details/82812888