体现了具体项目工程里面的分层,dao,daoImpl,service,serviceImpl,action。让你真正的理解这为啥分层。
顺便清清楚楚的理解@Component、@Service、@Repository 和 @Controller之间的关系。
顺便还可以学习下,什么是依赖注入--DI,什么是IOC--控制反转。
Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。
@Component是所有受Spring管理组件的通用形式;
而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)。
也就是说,
你能用@Component来注解你的组件类, 但如果用@Repository、@Service 或@Controller来注解它们,
你的类也许能更好地被工具处理,或与切面进行关联。
(切面暂且不管,后话啦)
分几个文件,如下:
先是各个组件,dao,daoImpl,service,serviceImpl,action。
1.PersonDao
package lxk.test.spring.mvc.annotation;
interface PersonDao {
void savePerson();
void updatePerson();
}
2.PersonDaoImpl
package lxk.test.spring.mvc.annotation;
import org.springframework.stereotype.Repository;
/**
* 经扫描注入容器之后,相当于在容器中声明了如下这么个bean
* <bean id="personDaoImpl" class="...PersonDaoImpl">
*/
@Repository("personDao")
public class PersonDaoImpl implements PersonDao {
public void savePerson() {
System.out.println("save person");
}
public void updatePerson() {
System.out.println("update person");
}
}
3.PersonService
package lxk.test.spring.mvc.annotation;
interface PersonService {
void savePerson();
void updatePerson();
}
4.PersonServiceImpl
package lxk.test.spring.mvc.annotation;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class PersonServiceImpl implements PersonService {
//此属性,没有对应的getter和setter,而是有spring容器负责给这个属性设值。
//一般情况下,要用这个属性,得自己设置,现在容器帮我们干了。
// 这就是传说中的----控制反转(IOC)----哦,依赖注入的缩写是 DI
@Resource(name = "personDao")
private PersonDao personDao;
//上面的@Resource后面带括号,就要靠id(即bean的id=personDao)去容器中找到对应的bean。
//在容器中找到PersonDaoImpl(PersonDao接口类未带注解,所以容器不管他),因为他带有注解(容器会管他的)的一个bean
public void savePerson() {
this.personDao.savePerson();
}
public void updatePerson() {
this.personDao.updatePerson();
}
}
5.PersonAction
package lxk.test.spring.mvc.annotation;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class PersonAction {
//此属性,没有对应的getter和setter,而是有spring容器负责给这个属性设值。
//一般情况下,要用这个属性,得自己设置,现在容器帮我们干了。
// 这就是传说中的----控制反转----
@Resource
private PersonService personService;
//上面的@Resource后面没带括号,就要靠类型去容器中找到对应的bean。
//在容器中找到类型是PersonService(此类型有2个:service接口和其实现类)的带有注解(service实现类)的一个bean
public void savePerson() {
this.personService.savePerson();
}
public void updatePerson() {
this.personService.updatePerson();
}
}
6.main
package lxk.test.spring.mvc.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
//ApplicationContext context = new ClassPathXmlApplicationContext("file:E:/fusion/intellij_work/TrunkNew/src/main/java/lxk/test/spring/mvc/annotation/applicationContext.xml");
//ApplicationContext context = new FileSystemXmlApplicationContext("file:E:/fusion/intellij_work/TrunkNew/src/main/java/lxk/test/spring/mvc/annotation/applicationContext.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/java/lxk/test/spring/mvc/annotation/applicationContext.xml");
PersonAction personAction = (PersonAction) context.getBean("personAction");
personAction.updatePerson();
}
}
7.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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="lxk.test.spring.mvc.annotation"/>
</beans>
测试执行结果图:
具体文件的位置摆放:
注意:发现上面的注解有的带括号啦,有的没带,主要是为了学习用,可以很好的理解注解的作用,实际开发中,每个注解上面最好都得带上括号中的内容。以防发生意外的错误,等等。