附:三层经典分层模型

层级 主要职责 常见 Spring 注解 / XML 方式 典型代码/类
表现层(Controller)
(有时叫 Web层)
接收 HTTP 请求、解析参数、返回 JSON / 页面。只负责把请求转发给业务层,不写业务逻辑。 @Controller / @RestController
(或在 XML 里 <bean class="…Controller"/> + <context:component-scan>
UserController
业务层(Service) 业务规则、事务控制、调用 DAO。保持业务完整且可复用,对外提供业务 API。 @Service (XML <bean class="…ServiceImpl"/> UserServiceUserServiceImpl
持久层(DAO / Repository)
(负责数据库)
把业务对象映射到数据库(SQL、MyBatis、JPA)。只关注 CRUD,不做业务。 @Repository (XML <bean class="…UserDao"/> UserDao
领域对象(POJO / Entity / DTO) 纯粹的数据结构:属性 + getter/setter(不含业务方法)。在 Controller ↔ Service ↔ DAO 间流转。 @Entity(JPA)或普通 POJO(不需要注解) UserUserDto

三层模型目的是实现分层解耦,以便于后期维护。三层模型关系如下:

src/main/java/com/example/dao/    ← 主目录 

├─ UserDao.java          ← 接口(只定义方法,类似于告诉spring有这么个东西)

├─ UserDaoImpl.java      ← 正式实现(告诉spring这个东西具体是什么)

├─UserDaoDemo.java      ← 演示/测试实现(内存 Map,方便跑 Demo 或单元测试,主程序)


└─applicationContext.xml      ←代码运行的配置文件

一整个目录:

UserDao.java:

package com.text;

/**
 * 用户数据访问对象接口
 * 定义了用户数据操作的基本方法
 */
public interface UserDao {
    /**
     * 保存用户信息的方法
     */
    public void save();
}

UserDaoImpl.java

package com.text.impl;

import com.text.UserDao;

/**
 * 用户数据访问对象实现类
 * 实现了UserDao接口,提供具体的数据访问逻辑
 */
public class userDao implements UserDao {
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 实现保存用户信息的方法
     * 当前为示例实现,输出测试信息
     */
    private  String name;
    private int age;
    public void save() {
        System.out.println("保存用户信息:" + name + ",年龄:" + age);
        System.out.println("hello spring!");
    }
}

UserDaoDemo.java

package com.test.demo;

import com.text.impl.userDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 用户数据访问对象测试类
 * 用于演示Spring IoC容器的基本使用
 */
public class UserDaoDemo {
    /**
     * 主方法 - Spring IoC容器测试入口
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建Spring应用上下文,加载配置文件
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        // 从容器中获取userDao Bean实例
        userDao userDao = (userDao) app.getBean("userDao");
        
        // 调用save方法
        userDao.save();
    }
}

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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <import resource="applicationContext-product.xml"></import>
    <import resource="applicationContext-user.xml"></import>
    <bean id="userDao" class="com.text.impl.userDao">
        <property name="age" value="20"/>
        <property name="name" value="18"/>
    </bean>
<!--    <bean id="userService" class="com.service.impl.userServiceImpl">-->
<!--        <property name="userDao" ref="userDao"></property>-->
<!--    </bean>-->
<!--    <bean id="userService" class="com.service.impl.userServiceImpl" p:userDao-ref="userDao"></bean>-->
    <bean id="userService" class="com.service.impl.userServiceImpl">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
</beans>
  • 大多数情况下,SpringBoot 会把 XML 配置变成 Java 注解(@Configuration@Bean 等),但了解 XML 仍然是理解 Spring “幕后” 工作原理的最佳入口。
  • 所有标签都必须放在根 <beans> 元素内部,根标签默认使用 Spring DTD/ XSD(后面给出写法)。

根标签 <beans>

属性 用途 示例
xmlnsxmlns:xsixmlns:contextxmlns:util 声明命名空间(必填),让 XML 能识别 Spring、Spring‑Context、Spring‑Util 等标签。 xml\n<beans xmlns="http://www.springframework.org/schema/beans"\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xmlns:context="http://www.springframework.org/schema/context"\n xmlns:util="http://www.springframework.org/schema/util"\n xsi:schemaLocation="http://www.springframework.org/schema/beans\n https://www.springframework.org/schema/beans/spring-beans.xsd\n http://www.springframework.org/schema/context\n https://www.springframework.org/schema/context/spring-context.xsd\n http://www.springframework.org/schema/util\n https://www.springframework.org/schema/util/spring-util.xsd">
default-autowire 为所有子 <bean> 设置默认 自动装配 方式(nobyNamebyTypeconstructor)。 default-autowire="byType"
default-lazy-init 默认 懒加载(true/false),true 时 Bean 在容器启动时不实例化,只有被真正使用时才创建。 default-lazy-init="true"
default-destroy-method 为所有 Bean 指定统一的 销毁回调方法(若 Bean 本身未声明 destroy-method 时使用)。 default-destroy-method="close"
profile(Spring 5.1+) 只在匹配的 profile 环境下激活该 <beans> 块。 <beans profile="dev"> … </beans>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">
    …  <!-- 下面写具体的 bean、import、alias 等 -->
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">
    …  <!-- 下面写具体的 bean、import、alias 等 -->
</beans>

导入外部资源 – <import>

属性 说明 示例
resource 导入 另一个 XML 配置文件的路径。支持 Ant 路径(classpath*:, file: 等),可以一次导入多个文件(使用通配符 *)。 <import resource="classpath*:datasource.xml"/>
optional(Spring 5+) true,当资源 不存在 时不抛异常,适用于可选的配置。 <import resource="classpath:extra.xml" optional="true"/>

使用场景:把 数据源、事务管理器、第三方库 配置拆分成独立文件,主配置只负责 import


别名 – <alias>

属性 说明 示例
name 原 Bean 名称(或 id)。 name="orderService"
alias 想要 额外声明的别名,可以在代码或其他 XML 中使用。 alias="orderSvc"

这样 orderServiceorderSvc 都能引用同一个 Bean。


Bean 定义 – <bean>

核心标签,几乎每一个业务对象都要在这里声明。下面先列出 属性,随后给出 子元素(依赖注入方式)以及完整示例。

4.1 常用属性( 几乎每个属性都可能出现 )

属性 必填? 作用
id 是(如果不使用 name Bean 在容器中的 唯一标识(推荐使用驼峰式 orderService)。
name 别名,可以写多个,用逗号分隔(name="orderService,orderSvc"),等价于 <alias>
class 是(除非是 <bean parent="…"> 的子 Bean) 完全限定类名,例如 com.example.service.OrderServiceImpl
parent 继承另一个 Bean 的定义(属性、构造参数等会被继承)。
scope Bean 的 作用域(singleton(默认)/ prototype / request / session / application / globalSession)。
lazy-init 是否 懒加载(覆盖根标签的 default-lazy-init)。
autowire 该 Bean 的 自动装配 方式(nobyNamebyTypeconstructor),覆盖 default-autowire
depends-on 设定 依赖的 Bean 名称列表(确保这些 Bean 先初始化)。
init-method Bean 初始化后要调用的自定义方法名(必须是 public void 方法())。
destroy-method Bean 销毁前要调用的方法名(如 closeshutdown)。
abstract 把 Bean 标记为 抽象(只作为父 Bean 使用,容器不会实例化)。
primary(Spring 3.0+) 当出现 多个候选 Bean 时,标记此 Bean 为首选。
factory-method 工厂方法(静态或实例方法)创建 Bean,而不是直接 new 类。
factory-bean 指向 工厂 Bean(该 Bean 本身负责创建目标 Bean)。
qualifier(配合 @Qualifier 在 XML 中声明 限定符,帮助注解装配时区分同类型的 Bean。

4.2 子元素 – 依赖注入的三大入口

子元素 位置 说明 常用属性
<property> <bean> Setter 注入(属性注入)。属性名对应 POJO 的 setter(setXxx)。 name(属性名)
value(字面值)
ref(引用其它 Bean)
type(属性类型)
p:(简写)
<constructor-arg> <bean> 构造函数注入,可以通过 index(顺序)或 type(参数类型)定位。 indextypevaluerefp:
<qualifier> <bean>(子标签) 为 自动装配 声明限定符,配合 @Qualifier 使用。 type(限定符类名)或 value(自定义字符串)
<lookup-method><replaced-method> <bean>(高级) 运行时方法注入(Lookup Method Injection)与 方法替换(Method Replacement),主要用于 Prototype‑in‑Singleton 场景。

集合属性注入(常用在 <property>

  • <list> / <set><value>、<ref>、<bean>
  • <map><entry key="k" value="v"/><entry key-ref="someBean" value-ref="otherBean"/>
  • <props>(键值对,等价于 java.util.Properties

4.3 依赖注入实例(最常见两种方式)

(1) Setter 注入(使用 <property>

xml

<bean id="orderService" class="com.example.service.OrderServiceImpl">
    <!-- 注入 dataSource(另一个 Bean) -->
    <property name="dataSource" ref="myDataSource"/>
    <!-- 注入字符串属性 -->
    <property name="defaultStatus" value="PENDING"/>
    <!-- 注入集合 -->
    <property name="supportedTypes">
        <list>
            <value>ONLINE</value>
            <value>OFFLINE</value>
        </list>
    </property>
</bean>
<bean id="orderService" class="com.example.service.OrderServiceImpl">
    <!-- 注入 dataSource(另一个 Bean) -->
    <property name="dataSource" ref="myDataSource"/>
    <!-- 注入字符串属性 -->
    <property name="defaultStatus" value="PENDING"/>
    <!-- 注入集合 -->
    <property name="supportedTypes">
        <list>
            <value>ONLINE</value>
            <value>OFFLINE</value>
        </list>
    </property>
</bean>

对应的 POJO 需要 setDataSource(DataSource), setDefaultStatus(String), setSupportedTypes(List<String>) 方法。

(2) 构造函数注入(使用 <constructor-arg>

xml

<bean id="paymentProcessor" class="com.example.payment.PayProcessor">
    <!-- 按顺序注入 -->
    <constructor-arg index="0" ref="payGateway"/>
    <constructor-arg index="1" value="USD"/>
    <!-- 也可以按类型匹配 -->
    <constructor-arg type="com.example.gateway.Gateway" ref="payGateway"/>
    <constructor-arg type="java.lang.String" value="USD"/>
</bean>
<bean id="paymentProcessor" class="com.example.payment.PayProcessor">
    <!-- 按顺序注入 -->
    <constructor-arg index="0" ref="payGateway"/>
    <constructor-arg index="1" value="USD"/>
    <!-- 也可以按类型匹配 -->
    <constructor-arg type="com.example.gateway.Gateway" ref="payGateway"/>
    <constructor-arg type="java.lang.String" value="USD"/>
</bean>

POJO 必须有对应构造函数:

java

public PayProcessor(Gateway gateway, String currency) { … }
public PayProcessor(Gateway gateway, String currency) { … }
(3) 内联 Bean(作为属性值直接声明)

xml

<bean id="userService" class="com.example.service.UserServiceImpl">
    <property name="validator">
        <bean class="com.example.validation.UserValidator">
            <property name="maxLength" value="20"/>
        </bean>
    </property>
</bean>
<bean id="userService" class="com.example.service.UserServiceImpl">
    <property name="validator">
        <bean class="com.example.validation.UserValidator">
            <property name="maxLength" value="20"/>
        </bean>
    </property>
</bean>

这里 validator 属性直接使用 内联 Bean,不需要再单独声明 id


常用集合标签(配合 <property><constructor-arg>

标签 用途 示例
<list> 注入 java.util.List,顺序固定。 xml\n<property name="roles"><list><value>ADMIN</value><value>USER</value></list></property>
<set> 注入 java.util.Set,自动去重。 xml\n<property name="ids"><set><value>1</value><value>2</value></set></property>
<map> 注入 java.util.Map(键/值均可是 Bean、字面值、或子 Bean)。 xml\n<property name="urlMap"><map><entry key="home" value="/index.html"/><entry key-ref="loginUrl" value-ref="loginBean"/></map></property>
<props> 注入 java.util.Properties(键/值全是字符串)。 xml\n<property name="mailProps"><props><prop key="mail.smtp.host">smtp.example.com</prop></props></property>
<value> 单个文字值(可加 type 强制转换) <value type="int">10</value>
<ref> 引用其他 Bean(等价于 ref 属性) <ref bean="orderDao"/>

简写:Spring 还提供 p: 命名空间(p‑属性注入),在根 <beans> 中加入 xmlns:p="http://www.springframework.org/schema/p" 后可以这样写:

xml

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"
      p:host="smtp.example.com"
      p:port="587"
      p:username="user"
      p:password="pwd"/>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"
      p:host="smtp.example.com"
      p:port="587"
      p:username="user"
      p:password="pwd"/>

其他常见的 Spring‑XML 辅助标签(不是 Bean 本身)

标签 所属命名空间 作用
<context:component-scan> http://www.springframework.org/schema/context 根据 base-package 自动 扫描 带 @Component@Service@Repository@Controller 的类并注册为 Bean。
<context:property-placeholder> http://www.springframework.org/schema/context 加载 .properties / .yml(使用 ${…} 占位符)并注入到 <property value="${…}"/> 中;Spring 5 推荐使用 @PropertySourceEnvironment
<util:properties> http://www.springframework.org/schema/util 把属性文件直接注册为 java.util.Properties Bean,供其它 Bean 注入。
<util:list><util:set><util:map> util 直接在 XML 中声明集合(同 <list>/<set>/<map>,但可以不依赖 <property> 包裹),常用于 常量 Bean。
<tx:annotation-driven><tx:advice> http://www.springframework.org/schema/tx 启用 声明式事务(@Transactional)或基于 AOP 的事务配置。
<aop:config><aop:aspect><aop:pointcut><aop:advisor> http://www.springframework.org/schema/aop 配置 AOP(切面、通知、切点)——如果你使用 @AspectJ 注解方式,这些标签常常不需要。
<mvc:annotation-driven><mvc:resources> http://www.springframework.org/schema/mvc 在非 SpringBoot 项目中打开 Spring MVC 的注解功能(@Controller@RequestMapping)。

注意:在 SpringBoot 项目里,这些 XML 配置大多已被 @Configuration 注解取代;但了解它们有助于阅读 老项目 或 第三方库 的 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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx
           https://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop
           https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- ---------------------------------------------------- -->
    <!-- 1️⃣ 导入外部配置(可选) -->
    <import resource="classpath*:datasource.xml"/>

    <!-- ---------------------------------------------------- -->
    <!-- 2️⃣ 组件扫描(把 @Component、@Service 等自动加入容器) -->
    <context:component-scan base-package="com.example"/>

    <!-- ---------------------------------------------------- -->
    <!-- 3️⃣ 属性占位符(读取 application.properties) -->
    <context:property-placeholder location="classpath:application.properties"
                                   ignore-unresolvable="true"/>

    <!-- ---------------------------------------------------- -->
    <!-- 4️⃣ Bean 定义(示例) -->
    <bean id="orderService" class="com.example.service.OrderServiceImpl"
          init-method="init" destroy-method="cleanup"
          scope="singleton" lazy-init="false">

        <!-- 属性注入(setter) -->
        <property name="orderDao" ref="orderDao"/>
        <property name="maxItems" value="100"/>

        <!-- 集合注入 -->
        <property name="supportedTypes">
            <list>
                <value>ONLINE</value>
                <value>OFFLINE</value>
            </list>
        </property>
    </bean>

    <!-- 另一个 Bean(被上面引用) -->
    <bean id="orderDao" class="com.example.dao.OrderDaoImpl">
        <property name="dataSource" ref="myDataSource"/>
    </bean>

    <!-- DataSource 示例(使用 factory-method) -->
    <bean id="myDataSource"
          class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url"              value="${jdbc.url}"/>
        <property name="username"         value="${jdbc.username}"/>
        <property name="password"         value="${jdbc.password}"/>
    </bean>

    <!-- ---------------------------------------------------- -->
    <!-- 5️⃣ AOP 示例(日志切面) -->
    <aop:config>
        <aop:pointcut id="serviceMethods"
                      expression="execution(* com.example.service.*.*(..))"/>
        <aop:advisor advice-ref="logAdvice" pointcut-ref="serviceMethods"/>
    </aop:config>

    <bean id="logAdvice" class="com.example.aop.LoggingAdvice"/>

    <!-- ---------------------------------------------------- -->
    <!-- 6️⃣ 事务管理(声明式) -->
    <tx:annotation-driven transaction-manager="txManager"/>

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="myDataSource"/>
    </bean>

</beans>
<?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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx
           https://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop
           https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- ---------------------------------------------------- -->
    <!-- 1️⃣ 导入外部配置(可选) -->
    <import resource="classpath*:datasource.xml"/>

    <!-- ---------------------------------------------------- -->
    <!-- 2️⃣ 组件扫描(把 @Component、@Service 等自动加入容器) -->
    <context:component-scan base-package="com.example"/>

    <!-- ---------------------------------------------------- -->
    <!-- 3️⃣ 属性占位符(读取 application.properties) -->
    <context:property-placeholder location="classpath:application.properties"
                                   ignore-unresolvable="true"/>

    <!-- ---------------------------------------------------- -->
    <!-- 4️⃣ Bean 定义(示例) -->
    <bean id="orderService" class="com.example.service.OrderServiceImpl"
          init-method="init" destroy-method="cleanup"
          scope="singleton" lazy-init="false">

        <!-- 属性注入(setter) -->
        <property name="orderDao" ref="orderDao"/>
        <property name="maxItems" value="100"/>

        <!-- 集合注入 -->
        <property name="supportedTypes">
            <list>
                <value>ONLINE</value>
                <value>OFFLINE</value>
            </list>
        </property>
    </bean>

    <!-- 另一个 Bean(被上面引用) -->
    <bean id="orderDao" class="com.example.dao.OrderDaoImpl">
        <property name="dataSource" ref="myDataSource"/>
    </bean>

    <!-- DataSource 示例(使用 factory-method) -->
    <bean id="myDataSource"
          class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url"              value="${jdbc.url}"/>
        <property name="username"         value="${jdbc.username}"/>
        <property name="password"         value="${jdbc.password}"/>
    </bean>

    <!-- ---------------------------------------------------- -->
    <!-- 5️⃣ AOP 示例(日志切面) -->
    <aop:config>
        <aop:pointcut id="serviceMethods"
                      expression="execution(* com.example.service.*.*(..))"/>
        <aop:advisor advice-ref="logAdvice" pointcut-ref="serviceMethods"/>
    </aop:config>

    <bean id="logAdvice" class="com.example.aop.LoggingAdvice"/>

    <!-- ---------------------------------------------------- -->
    <!-- 6️⃣ 事务管理(声明式) -->
    <tx:annotation-driven transaction-manager="txManager"/>

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="myDataSource"/>
    </bean>

</beans>

常见错误 & 排查技巧

错误现象 常见原因 解决办法
BeanCreationException: No qualifying bean of type … <bean> 没有被正确扫描(包名写错、component-scan 位置不对)或 id/name 拼写错误。 检查 base-package,或者把类显式写成 <bean id="xxx" class="…"/>
Circular reference involving … 循环依赖(A 注入 B,B 又注入 A)且均为 singleton。 1) 把其中一个改为 setter 注入(Spring 能在实例化后完成),
2) 或者使用 @Lazy、构造器注入时使用 ObjectFactory/Provider
BeanDefinitionStoreException: Invalid XML syntax XML 标签拼写错误、缺少闭合标签、或 schemaLocation 写错路径。 用 IDE 的 XML 验证(如 IntelliJ)或在线 XML 校验工具。
org.springframework.beans.factory.BeanCreationException: Could not resolve placeholder property-placeholder 没加载对应的 properties,或占位符写错。 确认 application.properties 在 classpath,且 <context:property-placeholder location="classpath:application.properties"/> 正确。
BeanNotOfRequiredTypeException ref 的 Bean 类型与属性 setter 所需类型不匹配。 检查 ref 指向的 Bean 类是否实现了正确的接口或父类。
IllegalStateException: Cannot determine target class for proxy(AOP 相关) AOP 切面只能代理 public 方法,没有接口且 proxy-target-class 未开启(默认使用 JDK 代理)。 <aop:config proxy-target-class="true"/> 或在 @EnableAspectJAutoProxy(proxyTargetClass = true) 开启 CGLIB 代理。

小结

关键标签 目的 必记属性/子标签
<beans> 容器根节点 default- 系列属性、命名空间
<import> 引入其他 XML 文件 resource
<alias> 为 Bean 再起一个别名 namealias
<bean> 定义业务对象 id/nameclassscopelazy-initautowireinit-methoddestroy-methoddepends-onprimaryfactory-method/factory-bean
<property> / <constructor-arg> 注入依赖(setter / 构造) name/indexrefvalue、集合子标签
<list> / <set> / <map> / <props> 注入集合或属性文件 <value><ref><entry>
<context:component-scan> 自动注册带注解的类 base-package
<context:property-placeholder> 加载 .properties、占位符 locationignore-unresolvable
<tx:annotation-driven> 开启 @Transactional 事务 transaction-manager
<aop:config> / <aop:aspect> 声明 AOP 切面(XML 方式) pointcutadvice-ref
<util:properties> / <util:list> 把常量/集合直接注册为 Bean locationid
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐