三层架构基于注解的自动装配

三层架构基于注解的自动装配

徐徐
后端
发布于2023-09-25 01:11:21
🌺前言
spring三层架构基于注解的自动装配

  • @Component :把类标记为普通组件及bean;
  • @Controller:标记为控制层组件
  • @Service:标记为业务层组件;
  • @Repository:标记为持久层组件

@Controller,@Service,@Repository本质都是一样的相当于@Component,取了三个新名字,只是为了程序看,方便理解.

1.扫描

表是告诉ioc哪些包下的类,使用了注解需要ioc管理

xml
<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">
    <context:component-scan base-package="com.xunjun.spring"></context:component-scan>
</beans>

2.排除扫描

1、排除指定注解的类-annotation

通过xml配置,可以将配置了@Service注解的类都排除掉

xml
   <context:component-scan base-package="com.coderp">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

2、排查指定切面的类-aspectj

采用aspectj过滤,“com.coderp.service.impl…*”:表示下面的包及其子包(包切入点)

xml
<context:component-scan base-package="com.coderp" >
        <context:exclude-filter  type="aspectj" expression="com.coderp.service.impl..*"/>
    </context:component-scan>

采用aspectj过滤,"*…Log":com.coderp所有的包及其子包下,只要有Log类,就会被排除

xml
<context:component-scan base-package="com.coderp" >
            <context:exclude-filter  type="aspectj" expression="*..Log"/>
        </context:component-scan>

3、排除继承至某接口或类的类-assignable

通过xml配置,将Log类或继承Log的类都排除掉

xml
<context:component-scan base-package="com.coderp">
        <context:exclude-filter type="assignable" expression="com.coderp.service.impl.Log"/>
    </context:component-scan>

4、排除符合指定匹配规则的类-regex

通过xml配置,将符合正则表达式模式的类进行排除

xml
<context:component-scan base-package="com.coderp">
        <context:exclude-filter type="regex" expression="com.coderp.service.impl.PayServiceImpl"/>
    </context:component-scan>

5、叠加进行排除

通过xml配置,可以对多种过滤方式进行组合,如下组合assignable和aspectj方式

xml
<context:component-scan base-package="com.coderp">
       <context:exclude-filter type="assignable" expression="com.coderp.service.impl.Log"/>
       <context:exclude-filter type="aspectj" expression="com.coderp.aspect..*"/>
   </context:component-scan>

3.包含扫描

默认整个包全部扫描 要想使用包含扫描,关闭默认选项配置属性 <context:component-scan base-package="com.xunjun.spring" use-default-filters="false"> <context:include-filter type="" expression=""/> </context:component-scan>

4.注解加扫描生成的bean的 id

• 默认是类型对应的小驼峰 • 自定义则是给注解传参 例如@Controller("id")

5.自动装配

给要装配的引用类型加上@Autowired;这时候对应的类的成员变量不需要getter,setter方法

1. 标注的位置:

• 引用类型的成员变量上 • 成员变量对应的set方法上 • 有参构造上

2. 原理

• 默认是使用byType匹配,当匹配到多个类型的时候,会自动转化为byName,将属性名作为id匹配 • 有如果匹配了多个类型,根据名字,一个没匹配上,这时候要在这个属性上要用注解@Qualifier(“id”)指定一个id去匹配赋值,否则异常 • 一个类型都匹配不上,则会报错,有别于xml的方式,除非@Autowired(require=false)则和xml方式一样,有则装配,没有则用默认值.

java
@Controller
public class UserController {
    @Autowired
    UserService userService;

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }
   public void saveUser(){
        userService.saveUser();
    }
}
java
@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void saveUser() {
        System.out.println("保存成功");
    }
}
java
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void saveUser() {
        userDao.saveUser();
    }
}

目录

文章最后更新于 2024-08-30 16:47:50
留言
暂无数据

~~空空如也