Spring—— Spring Core

本文介绍了Spring框架中的IoC(控制反转)和AOP(面向切面编程)概念,并详细阐述了如何在实际项目中应用这些技术。包括配置文件的读取方式、Bean的定义与注入过程,以及AOP中的方法拦截实现。

 IoC(inversion of control)控制反转,也就是说,控制权由对象转移,对象自己变成了被动的接受。

  DI(dependency injection)依赖注入

  AOP(aspect oriented programming)面向切面编程

 

  先简单的说说这个AOP  

 

  AOP中利用面向切面的编程理论,把每个方法或者函数当做一个切面,在这个切面前后都可以执行不同的方法。

1 <bean id="service">
2     <property name="interceptorNames" value="advisor"></property>
3     <property name="target">目标</property>
4 </bean>

  这里定义了一个拦截器,一个目标bean。

复制代码
1 <bean id="advisor" class="...">
2     <property name="advice">//拦截器对象
3     </property>
4     <property name="mappedName">//拦截的方法
5     </property>
6 </bean>
复制代码

  这个目标bean在执行时,会根据配置来确定切面,精确到某个方法。而拦截的方法由上面的mappedName确定,可以通过名字或者通过正则表达式来确定。拦截器对象确定了拦截时触发的函数。

  可以进行方法前拦截、方法后拦截、异常拦截。

 

  

  可以看到Spring Core是spring框架中最低层核心的模块。提供了最基本的Ioc思想框架。

 

  下面讲解一下如何使用!

 

  由于spring是把一个类配置在xml配置文件中,从而进行一些相关的依赖或者注入等等。那么这个配置文件,肯定要被本地化存储并且进行读取。

  因此在我们使用前,要进行三步:

  读取spring配置文件

  bean定义

  注入到Ioc容器

  之后我们就可以通过bean工厂的getBean获取指定的bean了。

  1 最常见的读取配置文件的三种方法:

  1 利用ClassPathResource读取资源文件,传入XmlBeanFactory中

1 ClassPathResource res = new ClassPathResource("application.xml")
2 XmlBeanFactory factory - new XmlBeanFactory(res);
3 factory.getBean("testBean");

  2 利用输入流,传入到XmlBeanFactory中

1 InputStream is = new FileInputStream("C:\\ApplicationContext.xml");
2 XmlBeanFactory factory - new XmlBeanFactory(is);

  3 直接通过ClassPathXmlApplicationContext读取资源文件

ClassPathXmlAppliationContext appContext = new ClassPathXmlApplicationContext("aaplicationContext.xml");

  4 通过在web.xml中指定配置文件的目录,自动读取。关于配置文件的路径有很多种写法,通过指定ClassPath也可以。

复制代码
 1 <listener>
 2         <listener-class>
 3             org.springframework.web.context.ContextLoaderListener
 4         </listener-class>
 5     </listener>
 6 
 7 <context-param>
 8   <param-name> contextConfigLocation</param-name>
 9              <param-value>
10                   /WEB-INF/classes/bean.xml
11              </param-value>
12  </context-param>
复制代码

  

  2 Bean的定义这部分就没什么好说的了,就是读取配置文件,解析里面的文件定义,抽取成数据模型。

  3 而注入到Ioc容器中,就是把这个数据模型读取到一个总的BeanFactory中,统一的进行管理。

 

  我们就可以通过这个BeanFactory进行一些操作,比如GetBean()或者containsBean()等等。

 

  杂七杂八

 

  下面简单的罗列了一些配置的内容:

  1 工厂模式
<bean id="examples.MyFactoryBean" factory-method="createInstance"/>

  2 构造函数

复制代码
<bean id="testBean" class="examples.ExampleBean">
    <constructor-arg><ref bean="testArgs1"/></construtor-arg>
    <constructor-arg><ref bean="testArgs2"/></construtor-arg>
</bean>
 相当于
class testBean{
    public testBean(testArgs1,testArgs2);
}
复制代码

  3 单例模式

<bean id="testBean" class="test.testBean" singleton="false"> 每次请求生成的都是同一个bean

  4 <idef> 与 <ref>作用相同,但是idef会在xml加载时 检查 bean是否存在

destroy-method 销毁,通常都是配置数据源、JDBC、输入输入流时,需要在close时销毁对象
depends-on 先后顺序实例化
init-method 初始化调用方法
  8 也可以通过指定的接口,java类进行相应的操作:
BeanNameAware 让类知道自己bean在xml中的id名字
BeanFactoryAware 获得beanFactory
InitializingBean接口执行初始化方法
Disposablebean 执行销毁方法

  9 属性覆盖,这个通常是在配置了一些属性,但是有其他的一些文件修改了这个属性时,使用。

  比如说,我们在项目中通过spring的配置文件配置了数据源的相关信息,但是额外有一个xxx.properties进行信息的重写。当有这个文件时,可以让客户自己修改其连接信息,而不用每次都去修改繁琐的spring配置文件。

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
### Spring - context 概述 Spring - context 是 Spring 框架的核心模块之一,它提供了依赖注入(DI)和控制反转(IoC)容器的支持,以及其他企业级服务,如事件传播、资源加载、国际化等。 ### 功能介绍 - **依赖注入和 IoC 容器**:Spring - context 实现了强大的 IoC 容器,它负责创建和管理对象(Bean),并通过依赖注入的方式将对象之间的依赖关系进行解耦。例如,可以通过 XML 配置、Java 注解或 Java 配置类来定义 Bean 及其依赖关系。 ```xml <!-- XML 配置示例 --> <bean id="userService" class="com.example.UserService"> <property name="userRepository" ref="userRepository"/> </bean> <bean id="userRepository" class="com.example.UserRepository"/> ``` ```java // Java 注解示例 import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; @Service public class UserService { private UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } ``` - **事件机制**:Spring - context 提供了事件传播机制,允许应用程序中的组件发布和监听事件。这有助于实现松耦合的组件通信。例如,当用户注册成功后,可以发布一个用户注册事件,其他组件可以监听该事件并执行相应的操作。 ```java import org.springframework.context.ApplicationEvent; // 自定义事件类 public class UserRegisteredEvent extends ApplicationEvent { public UserRegisteredEvent(Object source) { super(source); } } import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; // 事件监听器 @Component public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> { @Override public void onApplicationEvent(UserRegisteredEvent event) { // 处理用户注册事件 } } ``` - **资源加载**:Spring - context 提供了统一的资源加载接口 `ResourceLoader`,可以方便地加载各种类型的资源,如文件、类路径资源、URL 资源等。 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.Resource; public class ResourceLoadingExample { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Resource resource = context.getResource("classpath:config.properties"); // 处理资源 } } ``` - **国际化支持**:Spring - context 支持国际化(i18n),可以根据用户的语言环境提供不同的文本信息。通过配置消息源和使用 `MessageSource` 接口,可以轻松实现国际化功能。 ```xml <!-- 配置消息源 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages"/> </bean> ``` ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class InternationalizationExample { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); String message = context.getMessage("welcome.message", null, java.util.Locale.ENGLISH); System.out.println(message); } } ``` ### 使用指南 1. **添加依赖**:如果使用 Maven 项目,在 `pom.xml` 中添加 Spring - context 依赖。 ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.23</version> </dependency> ``` 2. **配置 Bean**:可以使用 XML 配置、Java 注解或 Java 配置类来定义和配置 Bean。 3. **启动 Spring 容器**:根据配置方式的不同,使用相应的方式启动 Spring 容器。 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { // 启动 XML 配置的 Spring 容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取 Bean UserService userService = context.getBean(UserService.class); // 使用 Bean userService.doSomething(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值