spring-01

本文详细介绍Spring框架的基础概念,包括控制反转(IOC)、依赖注入(DI)等核心特性,并讲解了如何通过XML配置文件管理和创建对象。

前言

多年积累的模型mvc:model、view、controller

ssh:spring、strus2、hibernate(orm对象关系映射)

ssm:spring、springmvc、mybatis

牛人:rod johson

正文

Spring主要作用:

整合现在主流框架。使框架之间的调用更加的顺畅、快捷、方便管理

文章目录:

1.SpringIOC(控制反转)和DI(依赖注入)

2.统统使用注解形式简化配置

3. AOP面向切面编程

4.AOP的练习

5.springJDBC的整合  Spring的声明式的事务处理

一、SpringIOC:控制反转

定义:把对象的创建初始化和销毁的工作都交给spring容器来做。从此程序员无需关注对象的创建过程。

1.Person p1 = new Person();//主动创建
2.Person p2 = Spring容器.get**(); //对象创建的权利交给spring容器

二、问题

1.为什么要用这种方式创建对象

2.这样写的好处

三、IOC的实现步骤:

1.导入相关jar

2.创建实体类

3.编写配置文件xml(1.配置文件的头     2.配置实体类对应关系)

4.启动spring容器

5.得到相应的对象    对象调用方法完成相应的功能。

四、具体的实现:

1.导包


2.创建实体类

public class Hello {
//第二步 创建实体类
public void say(){
System.out.println("Hello Spring ");
}
}

3.配置xml文件(在src目录下)

(1)配置文件的默认的名称就是 applicationContext.xml

(2)配置文件的名称任意,但是一般都写默认的

 其余的程序员一看就知道是spring的配置文件

(3)配置文件的头

1>直接粘贴    有模板

2>通过手动生成《手动生成配置文件的头》

(4)配置实体类的对应关系
<?xml version="1.0" encoding="UTF-8"?>
<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 
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
 
<!--只要spring容器管理对象就是一个bean
id:唯一标识  首字母小写的类名   后边驼峰规则
class:包名+类名
  -->
<bean id="hello"  class="domain.Hello"></bean>
 
</beans>

其中class中要写的对应的类的包名加类名不要手动写,可以写类的前几个字母然后alt+/可以选你写的类然后可以自动补全类名加包名了

4.启动spring容器

//第四步:启动spring的容器
ApplicationContext  context = 
new ClassPathXmlApplicationContext("applicationContext.xml");

以上代码是面向接口的编程方式:前面是接口后面new的是实现类

5.获取对象

//第五步 获取相应的对象
Hello hello = (Hello) context.getBean("hello");
hello.say();

五、IOC的实现过程

当容器启动的时候首先会先加载applicationContext.xml,顺序加载当遇到Bean标签的时候根据class的路径找到相应的实体类并且创建对象,把创建出来的对象放到spring容器里。内存中维护了一张mapspring容器内部维护了一张MAP<key,value> 对象的ID就是MAP中的Key  、对象就是value保存在spring器中。如果想获得相应的对象 则通过getBean("ID")就能得到应用的对象

翻源码来证明以上所述:点击打开链接

六、常见的问题:

(1) Xml 文件放错位置了:没有将配置文件放到src目录下

(2)代码中beanID编写错误

七、关于bean的问题

配置:


使用:


报错:

建议使用id,因为使用class可能会造成1对二的情况,如下报错


发生场景:

一个项目有多人开发,当多个人想要使用Hello这个类时,每个人都在配置文件中编写一个对应关系(id是各自定义的,class都是Hello类),在使用类来获取对象时就会发生以上报错

八、别名标签

<!--别名标签  -->

<aliasname="hello" alias="1606"/>

使用场景,需要一个class对应多个id时使用,比方说在一个项目中每个项目部门规定了自己本部门的对一个类的命名id,这时可以使用别名标签。

可以避免6(使用class找时)一对二的问题

九、Spring对象创建的原理

//domain.Hello

Class.forName(Hello.class.getName()).newInstance();

十、无参构造的重要性

我们spring底层通过反射调用的形式创建对象,所以实体类中必须要有无参构造。以后在手动编写构造方法的时候一定切记要加无参构造


十一、spring容器创建对象的四种方式

1.通过默认的构造方法创建对象

2.通过静态工厂创建对象

<!--静态工厂创建对象  -->

<beanid="calendar" class="factory.StaticFactory" factory-method="getTime"></bean>

具体步骤:

spring容器启动的时候顺序加载xml配置文件。找到相应的bean 根据class找到静态工厂 再通过factory-method="getTime"getTime方法创建对象,把对象放到spring容器中。

如果在静态工厂中没有static 就会报如下错


3.实例工厂创建对象

<!--实例工厂创建对象  -->

<beanid="newInstanceFactory" class="factory.NewInstanceFactory"></bean>

<beanid="newCalendar" factory-bean="newInstanceFactory"factory-method="getTime"></bean>

说明:

实例工厂和静态工厂最大的区别在于工厂对象是否被创建

4.spring工厂创建对象

xml配置文件

<!--spring工厂创建对象  -->

<beanid="springCalendar" class="factory.SpringFactory"></bean>

 

需要实现一个接口  然后自动调用 getObject()

//spring工厂创建对象

public classSpringFactory implements FactoryBean<Calendar>{

 

@Override

public CalendargetObject() throws Exception {

 

returnCalendar.getInstance();

}

 

@Override

publicClass<?> getObjectType() {

// TODO Auto-generatedmethod stub

returnCalendar.class;

}

 

@Override

public booleanisSingleton() {

// TODOAuto-generated method stub

return false;

}

 

}

十二、Spring容器创建对象是单例还是多例的

当在默认的条件下spring容器创建对象是单例的

好处能够提高计算机的性能,减少内存的压力。

 

 

<!--测试spring单例和多例

 scope="prototype" 多例对象

 

 默认条件下和 scope="singleton" 都是单例的

 

 -->

<beanid="person" class="domain.Person"scope="singleton"></bean>

 

spring容器只负责维护单例对象,多例对象spring只负责创建然后自生自灭

十三、自定义的初始化方法(对象创建后被调用)和销毁方法(容器关闭后被调用)

init-method="init"destroy-method="destroy"

容器关闭(把接口ApplicationContext替换为实现类ClassPathXmlApplicationContext后有close方法)

ClassPathXmlApplicationContextcontext =

newClassPathXmlApplicationContext("applicationContext.xml");

 Person p1 = (Person)context.getBean("person");

 p1.add();

 context.close();

十四、对象的懒加载

问题:spring容器启动的时候就会根据bean来创建对象,并且是全部创建,对于这种模式程序性能不能提高

理想模式:当我需要使用某个对象的时候,这个对象才会被创建。如果我不需要的时候,那么这个对象就不会被创建出来。

 

<!--懒加载的配置

lazy-init="default" 

lazy-init="false"        默认的就是立即加载

lazy-init="true"        进行懒加载

  -->

<beanid="person" class="domain.Person"lazy-init="true"></bean>

 

注意

<beanid="person" class="domain.Person"lazy-init="false" scope="prototype"></bean>

对象的属性scopeprototype的时候多例对象 立即加载会失效。

会变成懒加载。因为容器不知道使用者到底要创建多少对象。

 

注意:

lazy-init="default"  这时需要查看default-lazy-init="false"

它的匹配规则和默认的保持一致

当全局的懒加载和bean中的懒加载不一致时,按照bean中的配置执行。

 

关于多例对象销毁问题

当多例对象时容器只负责创建其他一概不管。


关于懒加载的问题:

如果不使用懒加载,启动容器后会顺序创建类,如果类有错会发现,如果都改为懒加载,只有在用到这个类时才会报错。所以编写时最好不使用懒加载,可以及时发现问题,将程序调节好后,再将需要使用懒加载的地方改为懒加载。 



资源:点击打开链接

<think>我们正在处理用户的问题:"spring-01-ioc is not recognized as a Gradle project"。用户可能在尝试导入或构建一个名为'spring-01-ioc'的项目时遇到了问题,提示该项目不是一个Gradle项目。 根据常见的开发经验,这个问题通常发生在以下情况: 1. 项目目录中缺少Gradle的构建文件(如build.gradle或build.gradle.kts)。 2. IDE(如IntelliJ IDEA)在打开项目时没有正确识别Gradle项目。 3. 项目是从其他地方复制过来的,可能结构不完整。 解决方案通常包括: - 确认项目根目录下是否存在build.gradle文件。如果没有,需要创建。 - 如果项目原本是Gradle项目,可能是文件损坏或丢失,可以尝试重新构建或从版本控制中恢复。 - 在IDE中,可以尝试手动导入为Gradle项目。 同时,我们注意到用户之前提到了一些关于Spring配置的引用,但当前问题与Gradle项目识别有关,所以我们将主要关注Gradle项目结构问题。 步骤: 1. 检查项目目录结构,确保存在build.gradle文件。 2. 如果存在build.gradle,尝试在命令行中运行`gradle tasks`来验证Gradle是否能识别项目。 3. 在IDE中,可以尝试重新导入项目。 另外,引用[3]中提到了使用YAML配置多个profile,但这与Gradle项目识别无直接关系。不过,如果用户的项目是一个Spring Boot项目,那么通常我们会使用Gradle或Maven来构建。 因此,我们将指导用户检查项目结构并提供创建基本build.gradle文件的示例(如果缺失)。 注意:用户的问题中项目名为'spring-01-ioc',这看起来像是一个Spring相关的项目,因此我们假设它需要Spring Boot的依赖。 我们将创建一个简单的build.gradle示例,适用于Spring Boot项目。 同时,考虑到用户可能不熟悉Gradle,我们会解释基本步骤。 另外,如果用户使用的是Gradle Wrapper,那么还应该检查gradlew(或gradlew.bat)和gradle/wrapper目录是否存在。 如果用户没有使用Wrapper,建议初始化Wrapper,因为这样能保证构建环境的一致性。 因此,我们的回答将包括: 1. 检查项目结构。 2. 创建build.gradle文件(如果缺失)。 3. 初始化Gradle Wrapper(可选,但推荐)。 4. 在IDE中重新导入项目。 由于用户的问题中提到了“is not recognized as a Gradle project”,我们重点解决Gradle项目的识别问题。 下面开始组织回答。</think>### 解决 "spring-01-ioc is not recognized as a Gradle project" 错误 这个错误表明您的开发环境(如 IntelliJ IDEA 或命令行)无法识别当前目录为有效的 Gradle 项目。以下是分步解决方案: #### 1. **验证项目结构** - 确保项目根目录包含 **build.gradle** 文件(Gradle 的核心配置文件) - 检查基本目录结构应包含: ``` spring-01-ioc/ ├── build.gradle ← 必须存在 ├── settings.gradle ← 推荐存在 ├── gradlew ← Gradle Wrapper 脚本 ├── gradlew.bat ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── src/ ← 源代码目录 ``` - 如果缺少这些文件,说明项目未正确初始化[^1]。 #### 2. **重新初始化 Gradle 项目** **命令行操作:** ```bash # 进入项目目录 cd path/to/spring-01-ioc # 初始化 Gradle 项目(生成缺失文件) gradle init --type java-application # 使用 Gradle Wrapper 构建(确保权限) ./gradlew build # Linux/Mac gradlew.bat build # Windows ``` #### 3. **IDE 中的修复步骤(以 IntelliJ 为例)** 1. 关闭当前项目 2. 选择 **File > New > Project from Existing Sources** 3. 选择项目根目录的 **build.gradle** 文件 4. 勾选 **Use Gradle Wrapper** 选项 5. 点击 **Finish** 完成重新导入 #### 4. **检查 build.gradle 配置** 确保包含 Spring Boot 插件和依赖(基本示例): ```groovy plugins { id 'org.springframework.boot' version '3.1.0' // Spring Boot 插件 id 'io.spring.dependency-management' version '1.1.0' id 'java' } repositories { mavenCentral() // 依赖仓库 } dependencies { implementation 'org.springframework.boot:spring-boot-starter' } ``` #### 5. **常见问题排查** - **文件位置错误**:build.gradle 必须在项目根目录 - **Gradle 版本冲突**:使用 `./gradlew --version` 验证版本 - **缓存问题**:执行 `./gradlew clean --refresh-dependencies` - **代理设置**:在 **gradle.properties** 中添加网络代理配置(如果需要) ``` systemProp.http.proxyHost=proxyhost systemProp.http.proxyPort=8080 ``` > **关键提示**:Spring Boot 项目必须包含 `org.springframework.boot` 插件才能被正确识别为 Spring 项目[^2]。若使用多模块配置,需在 `settings.gradle` 中声明子模块: > ```groovy > rootProject.name = 'spring-01-ioc' > include 'submodule1', 'submodule2' > ``` ### 相关问题 1. 如何在现有 Maven 项目中迁移到 Gradle? 2. Spring Boot Gradle 插件的主要功能有哪些? 3. 如何解决 Gradle 构建时的依赖冲突问题? 4. IntelliJ IDEA 中如何配置 Gradle 的 JVM 版本? [^1]: 当 Gradle 核心文件缺失时,构建系统无法识别项目结构 [^2]: Spring Boot 插件提供自动配置和依赖管理功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值