SpringIOC学习笔记(二)---------注解实现IOC
一、相关概念
半配置-智能绑定
Java和XML是天作之合,所以在Java的世界中总是少不了XML。在框架中很多时候,我们的工作都是在配置XML文件。在配置越来越多的时候,其灵活性的优点被繁琐的这个弱点所打败。越来越多的开发会觉得XML的配置是一种拖累。于是现在的后期的框架会逐步的减少对XML的配置,就是“零配置”。
首先先介绍一种半配置的方式,这种半配置的方式用来解决的是Bean容器的其中一个功能;注入依赖。它就是智能绑定方式注入,算是依赖注入的一种。前面有个例子整体的配置如下:
<bean id="empDao" class="com.iflytek.emp.dao.EmployeeDao"></bean>
<bean id="empService" class="com.iflytek.emp.service.EmployeeService">
<property name="empDao" ref="empDao" />
</bean>
上述配置是使用了set的方式进行注入依赖。如果想不进行配置的依赖关系的话(智能绑定),可以按照如下的配置
<bean id="empDao" class="com.iflytek.emp.dao.EmployeeDao"></bean>
<bean id="empService" class="com.iflytek.emp.service.EmployeeService" autowire="byName">
</bean>
byName配置,Spring容器可以按照name的方式进行智能绑定,或者通过byType配置按照类型智能的绑定
注意:也可以在全局beans节点进行统一的配置 default-autowire="byName" 将所有的Bean进行配置成智能绑定的规则。
这样做的好处可以减少一半的配置工作,即依赖关系的配置。但是对于Bean的配置还是需要继续配置的,不过已经少了很多配置了,这样也很不错了。
智能绑定:优点可以减少依赖关系,缺点从XML上无法看到Bean之间的依赖关系了。
Spring的零配置
Spring核心功能是实现Bean的管理和依赖注入。配置文件也是分为如下两个步骤:
1)配置Bean
2)配置Bean的依赖
前面学到的使用智能绑定的配置能够解决步骤2的配置依赖的部分;如果想彻底的实现取代XML的“零配置”方式,还需要解决配置Bean的这一部分。
Java受rails的启发,现在的框架都开始支持零配置方式或者正在走在零配置的路上。目前零配置有两种技术方案
1)“命名优于配置”的策略;
2)使用注解进行标记。
PS:“命名优于配置”的方式对程序员的命名方式必须按照一定的规则进行编写,对于平时命名不规范的程序员来说在简直是天灾和人祸。
Spring进行管理Bean,首先要知道哪个Bean是将要被纳入到容器中的。Spring容器会主动的“搜索”。“搜索”的目标Bean的特征使用注解进行标记。这就是Spring的零配置的原理——Spring容器搜索指定包下的有特定注解标记的Java类。
三、相关注解
标记Spring Bean,Spring提供了如下的几个注解:
1)@Component:用来标注任何一个普通的Java类
2)@Controller:用来标注一个控制类(Struts的Action或者Springwebmvc的Controller)
3)@Service:用来标注一个业务逻辑的Java类
4)@Repository:标注一个DAO的Java类
@Component标注任何一个Java类,包含另外三个所标记的Java类,但是在未来的Spring版本中或者在JavaEE开发的项目中都是推荐使用特定含义的注解进行标注。即尽量考虑使用@Controller、@Service、@Repository
四、代码实现
4.1目录结构
4.2Emp实体类
package com.emp.entity;
import java.util.jar.Attributes.Name;
import org.springframework.stereotype.Component;
//给Javabean命名方式,如果不使用@Component("Emp")命名,系统会以此类的类名命名,且首字母小写
@Component("Emp")
public class Emp {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4.2EmpDao接口类
package com.emp.dao;
import com.emp.entity.Emp;
public interface EmpDao {
public Emp showMessage();
}
4.3EmpDaoImpl实现类
package com.emp.dao.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
import com.emp.dao.EmpDao;
import com.emp.entity.Emp;
@Repository
public class EmpDaoImpl implements EmpDao {
private Emp emp;
@Resource(name="Emp")
public void setEmp(Emp emp) {
this.emp = emp;
}
@Override
public Emp showMessage() {
// TODO Auto-generated method stub
emp.setAge(20);
emp.setName("赵小航");
return emp;
}
}
4.4EmpService业务类
package com.emp.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.emp.dao.impl.EmpDaoImpl;
@Service
public class EmpService {
private EmpDaoImpl edi;
@Resource(name="empDaoImpl")
public void setEdi(EmpDaoImpl edi) {
this.edi = edi;
}
public void print() {
System.out.println(edi.showMessage().getAge()+edi.showMessage().getName());
}
}
4.5MainTest测试类
package com.emp.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.emp.service.EmpService;
public class MainTest {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");
EmpService service = (EmpService) cxt.getBean("empService");
service.print();
}
}
4.6spring.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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
" default-autowire="byName">
<!--查找bean的方式,总共分为三种1、通过名字2、通过类型3、通过构造函数 -->
<!--开启注解扫描-->
<context:component-scan base-package="com.emp.*" />
</beans>
4.7结果展示