1.注解配置组件类型
@Component:标识一个受spring IOC容器管理的组件。
@Repository:标识一个受spring IOC容器管理的持久化层组件。
@Service:标识一个受spring IOC容器管理的业务逻辑层组件。
@Controller:标识一个受spring IOC容器管理的表述层控制器组件。
命名规则:
1.默认情况,使用组件简单类名首字母小写后的字符串作为bean的id
2.使用组件注解的value属性指定bean的id
注:spring没有能力识别一个组件是不是它所标记的类型,所以以上四个组件在功能上没有区别。但是为了提高代码可读性,需要将不同功能的组件标上不同的注解,以明确当前组件扮演的角色。
一般的三层模型
控制层@Controller 接收请求
业务逻辑层@Service 处理业务逻辑
持久化层@Repository 实现数据持久化
请求打到Controller层,经过Service层到Dao层,再逐层返回响应到客户端。
利用@Autowired注解进行自动装配,优先使用byType策略,如果失败使用byName策略,再失败报错。
@Autorwired属性:required默认为true
表示是否必须装配该属性,装配不成功true时抛出异常,false时保持null,继续运行
可以在@Autowired注解后用@Qualifier(value = “”)指定用哪个bean进行自动装配。value处填写bean的id,原理是作用于set的形参来注入。
demo:
控制层
package class02.usermod.controller;
import class02.usermod.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Autowired
private UserService userService;
public void addUser() {
userService.addUser();
}
public UserController() {
System.out.println("UserController");
}
}
服务层
package class02.usermod.service;
import class02.usermod.dao.UserDao;
import class02.usermod.dao.UserDaoImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
/**
* 用@Qualifier(value = " ")指定用哪个具体的bean为userDao注入
*/
@Autowired
@Qualifier(value = "userDaImpl")
private UserDao userDao;
@Override
public void addUser() {
userDao.addUser();
}
public UserServiceImpl() {
System.out.println("UserServiceImpl");
}
}
持久化层
package class02.usermod.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("UserDaoImpl:添加成功");
}
public UserDaoImpl() {
System.out.println("UserDaoImpl");
}
}
在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>:扫描组件,在设置的包下面,对加上注解的类作为spring组件进行加载 -->
<!-- 即在spring的配置文件中生成对应的bean,这些bean的id会以类的首字母小写为值 -->
<!-- base-package处可填入多个包,用逗号分隔 -->
<context:component-scan base-package="class02.usermod"/>
<!-- 效果相当于-->
<!-- <bean id="userController" class="class02.usermod.controller.UserController"></bean>-->
<!-- <bean id="userDaoImpl" class="class02.usermod.dao.UserDaoImpl"></bean>-->
<!-- <bean id="userServiceImpl" class="class02.usermod.service.UserServiceImpl"></bean>-->
<!-- <context:include-filter>用法:包括指定的包 -->
<!-- use-default-filters意为全扫描 -->
<!-- 需要保证use-default-filters="false" -->
<!-- 可选annotation根据注解扫描或assignable根据类型扫描 -->
<!-- <context:component-scan base-package="class02.usermod" use-default-filters="false">-->
<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!-- <context:include-filter type="assignable" expression="class02.usermod.service.UserServiceImpl"/>-->
<!-- </context:component-scan>-->
<!-- <context:exclude-filter>用法:排除指定的包 -->
<!-- 需要保证use-default-filters="true"或缺省该属性 -->
<!-- <context:component-scan base-package="class02.usermod">-->
<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
<!-- <context:exclude-filter type="assignable" expression="class02.usermod.dao.UserDaoImpl"/>-->
<!-- </context:component-scan>-->
<!-- 每个context:component-scan中可以有多个include-filter或多个exclude-filter -->
<!-- 但include-filter和exclude-filter不能同时出现 -->
</beans>
测试类
package class02.usermod;
import class02.usermod.controller.UserController;
import class02.usermod.dao.UserDao;
import class02.usermod.dao.UserDaoImpl;
import class02.usermod.dao.UserDaoMybatisImpl;
import class02.usermod.service.UserService;
import class02.usermod.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
/**
* @Component,@Controller(控制层),@Service(业务层),@Repository(持久层)
* 以上四个注解功能完全相同,在实际开发中要在实现不同功能的类上加上相应的注解
* 完成组建的自动化管理:
* 1.在需要被spring管理的类上加相应注解
* 2.在xml配置文件中用<context:component-scan>写注解扫描器
* 这样会在spring配置文件中自动生成相应的bean,并以首字母小写的类名字符串为id的值(在注解处加value可以改变bean的值)
*
* 在需要赋值的非字面量属性上加@Autowired可以实现自动装配,会先按照byType匹配(要求至少有一个bean能为其赋值)
* 失败会用byName匹配(要求有一个bean的id和属性名完全一致),仍然失败就会报错
* 可以在@Qualified(value = " ")根据id指定用来装配该属性的bean
* 可以用@Autowired和@Qualified给一个方法注解,此时注解指定的bean作用于函数的形参,与方法名无关
*/
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("user.xml");
// id自动以首字母小写的类名为值
UserController uc = ac.getBean("userController", UserController.class);
System.out.println(uc);
// 实现类给接口类赋值
UserService us = ac.getBean("userServiceImpl", UserServiceImpl.class);
System.out.println(us);
UserDao ud = ac.getBean("userDaoImpl", UserDaoImpl.class);
System.out.println(ud);
System.out.println();
uc.addUser();
}
}
输出:
UserController
UserServiceImpl
UserDaoImpl
class02.usermod.controller.UserController@4009e306
class02.usermod.service.UserServiceImpl@43c1b556
class02.usermod.dao.UserDaoImpl@587e5365
UserDaoImpl:添加成功