您的位置:首页 > 编程语言 > Java开发

Spring中 基于注解的装配Bean 与 基于xml的对比总结

2017-02-26 09:06 411 查看

简介

注解:就是一个类,使用@注解名称

开发中:使用注解 取代 xml配置文件。

这边引用他人的总结

1. @Component取代<bean class="">
@Component("id") 取代 <bean id="" class="">
2.web开发,提供3个@Component注解衍生注解(功能一样)取代<bean class="">
@Repository :dao层
@Service:service层
@Controller:web层
3.依赖注入  ,给私有字段设置,也可以给setter方法设置
普通值:@Value("")
引用值:
方式1:按照【类型】注入
@Autowired
方式2:按照【名称】注入1
@Autowired
@Qualifier("名称")
方式3:按照【名称】注入2
@Resource("名称")
4.生命周期
初始化:@PostConstruct
销毁:  @PreDestroy
5.作用域
@Scope("prototype") 多例


程序入口

public class TestAnnoWeb {

@Test
public void demo02() {

String xmlPath = "com/guxiang/g_annotation/b_web/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
StudentAction studentAction = (StudentAction) applicationContext
.getBean("studentActionId");

studentAction.execute();
}

}


首先 加载配置文件 beans.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="com.guxiang.annotation.web"></context:component-scan>

</beans>


之后 第二句getBean(“studentActionId”)

在beans.xml 中没有找到 studentActionId

但是读取到了

<context:component-scan base-package="com.guxiang.annotation.web">
</context:component-scan>


于是开始从 注解中解析

读取到了

@Controller(“studentActionId”)

@Controller("studentActionId")
public class StudentAction {

@Autowired //默认按照类型
private StudentService studentService;

public void execute() {
studentService.addStudent();
}

}


在读取到studentActionId后

之中的这个

@Autowired //默认按照类型
private StudentService studentService;


由于我们所配置的 context:component-scan 中的package 下 只有一个实现了 studentService接口的类 StudentServiceImpl类

于是这个注解实际上等效于

StudentService studentService =new StudentServiceImpl();


或者说等效于

<property name="studentService" ref="studentServiceId"></property>
<bean id="studentServiceId" class="com.guxiang.annotation.web.StudentServiceImpl" >


于是我们开始实例化StudentServiceImpl 类

@Service
public class StudentServiceImpl implements StudentService {

private StudentDao studentDao;

@Autowired
@Qualifier("studentDaoId")
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}

@Override
public void addStudent() {
studentDao.save();
}

}


我们在set方法上方发现了注解

@Autowired
@Qualifier("studentDaoId")
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}


这是一种声明式按照名称的依赖注入的方式

在 于是 spring 开始搜寻 id 为 studentDaoId 的类

搜寻到

@Repository("studentDaoId")
public class StudentDaoImpl implements StudentDao {

@Override
public void save() {
System.out.println("dao");
}

}


于是实例化这个类对象

等效于

StudentDao studentDao = new StudentDaoImpl ();


或者说等效于

<property name="studentDao" ref="studentDaoId"></property>
<bean id="studentDaoId" class="com.guxiang.annotation.web.studentDaoId" >
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring bean xml