组成
-
Spring Core:核心容器,BeanFactory提供了组件生命周期的管理,组件的创建、装配,销毁等功能。
-
SpringContext:实现了ApplicationContext接口,Spring的上下文,拓展了核心容器,提供事件处理、国际化等功能。它还提供了一些企业级服务的功能,提供了JNDI、EJB、RMI的支持。
-
Spring Web:拓展了Spring上下文,提供Web应用上下文,对Web开发提供功能上的支持,如请求、表单、异常等。
-
Spring DAO:提供对JDBC的支持,还提供了DAO的支持,提供事务支持。
-
Spring ORM:对现有的O/R Mapping封装或支持。
-
Spring AOP:提供切面支持,是个轻量级的容器。
-
Spring Web MVC:全功能MVC框架,作用等同于Struts。
IOC本质
IOC是一种思想,而依赖注入(DI)只是它的一种实现。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式,Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(DI)。
hello
实体类
package com.depressiom.pojo;
import lombok.Data;
/**
* @ClassName Hello
* @Description hello spring
* @Date 2022/12/2
* @Author depressiom
*/
@Data
public class Hello {
private String str;
}
bean配置文件官网地址 https://docs.spring.io/spring-framework/docs/current/reference/html/core.html
<?xml version="1.0" encoding="UTF8"?>
<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">
<!-- 使用Spring创建对象,在Spring中这些都称为Bean
在Java中,要想创建一个对象,一般为 类型 变量名 = new 类型();
在Spring中,一个bean就相当于new 对象,其中id相当于变量名,
class相当于对象(类型),property相当于给对象中的属性设值
-->
<bean id="hello" class="com.depressiom.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
测试
@Test
public void test(){
// 获取Spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 对象都在Spring中管理了,要使用,直接通过bean绑定的id 取出来
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
这个过程就叫做控制反转
-
控制:谁来控制对象的创建,传统应用程序的对象由程序本身控制创建,使用Spring后,对象是由Spring来创建的
-
反转:程序本身不创建对象,而变成被动的接收对象
-
依赖注入:就是利用set方法来进行注入的
所谓的IOC:对象由Spring来创建,管理,装配
IOC创建对象的方式
-
默认使用无参构造方法创建对象
-
使用有参构造方法创建对象
<!-- 第一种通过下标赋值 -->
<!-- <bean id="user" class="com.depressiom.pojo.User">-->
<!-- <constructor-arg index="0" value="Test"/>-->
<!-- </bean>-->
<!-- 第二种方式,通过type创建 不建议使用-->
<!-- <bean id="user" class="com.depressiom.pojo.User">-->
<!-- <constructor-arg type="java.lang.String" value="type"/>-->
<!-- </bean>-->
<!-- 第三种,直接通过参数名设置 -->
<bean id="user" class="com.depressiom.pojo.User">
<constructor-arg name="name" value="type"/>
</bean>
在配置文件加载的时候,容器中管理的对象就已经初始化了
hello 加了一个无参构造,当取出user时加载配置,hello已经被初始化了
Spring配置说明
别名
<!-- 如果添加了别名,可以通过别名获取对象 -->
<alias name="user" alias="hello"/>
Bean的配置
<!-- Bean的配置
id:bean的唯一标识符,相当于pojo的对象名
class:bean对象对应的全限定名:包名+类型
name:取别名,而且name可以同时取多个名字
-->
<bean id="user" class="com.depressiom.pojo.User" name="user2,u2">
<constructor-arg name="name" value="type"/>
</bean>
import
一般用于团队开发使用,可以将多个配置文件,导入合并一个。
<?xml version="1.0" encoding="UTF8"?>
<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">
<import resource="beans.xml"/>
</beans>
依赖注入
构造器注入
上诉例子存在构造器注入
set注入
- 依赖注入:Set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
package com.depressiom.pojo;
import lombok.Data;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* @ClassName Student
* @Description 学生类
* @Date 2022/12/5
* @Author depressiom
*/
@Data
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private Properties info;
private String email;
}
<?xml version="1.0" encoding="UTF8"?>
<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 id="address" class="com.depressiom.pojo.Address">
<property name="address" value="北京天通苑"/>
</bean>
<bean id="student" class="com.depressiom.pojo.Student">
<!-- 第一种,普通值注入,value -->
<property name="name" value="小明"/>
<!-- 第二种,bean注入,ref -->
<property name="address" ref="address"/>
<!-- 第三种,array注入 -->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!-- 第四种,list注入 -->
<property name="hobbys">
<list>
<value>music</value>
<value>ball</value>
<value>game</value>
</list>
</property>
<!-- 第五种,Map注入 -->
<property name="card">
<map>
<entry key="身份证" value="599321199611237769"/>
<entry key="银行卡" value="622222344657995"/>
</map>
</property>
<!-- 第六种,Set注入 -->
<property name="games">
<set>
<value>LOL</value>
<value>DNF</value>
<value>BOB</value>
</set>
</property>
<!-- 第七种,Properties注入 -->
<property name="info">
<props>
<prop key="性别">男</prop>
<prop key="年龄">16</prop>
</props>
</property>
<!-- 第八种,null注入 -->
<!-- <property name="email" value=""/>-->
<property name="email">
<null/>
</property>
</bean>
</beans>
其他注入
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="john-classic" class="com.example.Person">
<property name="name" value="John Doe"/>
<property name="spouse" ref="jane"/>
</bean>
<bean name="john-modern"
class="com.example.Person"
p:name="John Doe"
p:spouse-ref="jane"/>
<bean name="jane" class="com.example.Person">
<property name="name" value="Jane Doe"/>
</bean>
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="beanTwo" class="x.y.ThingTwo"/>
<bean id="beanThree" class="x.y.ThingThree"/>
<!-- traditional declaration with optional argument names -->
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg name="thingTwo" ref="beanTwo"/>
<constructor-arg name="thingThree" ref="beanThree"/>
<constructor-arg name="email" value="[email protected]"/>
</bean>
<!-- c-namespace declaration with argument names -->
<bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
c:thingThree-ref="beanThree" c:email="[email protected]"/>
</beans>
bean作用域
- 单例模式(默认) Singleton
- 原型模式:每次从容器get的时候,都会产生一个新对象prototype
Bean的自动装配
是Spring满足bean依赖的一种方式
Spring中有三种装配的方式
- 在xml中显示的配置
- 在java中显示配置
- 隐式的自动装配
<!--
byName:会自动在容器上下文查找,和对象set方法后面的值对应的bean id
byType:会自动在容器上下文查找,和对象属性类型相同的bean id
-->
<bean id="student" class="com.depressiom.pojo.Student" autowire="byType">
byName需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致
byType需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致
使用注解实现自动装配
使用注解须知
- 导入约束
xmlns:context="http://www.springframework.org/schema/context"
- 配置注解的支持
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
Autowired
- 直接在属性上即可!也可以在set方法上使用
- 使用Autowired,可以不用编写set方法,前提是这个自动装配的属性在IOC(Spring)容器中存在,并且符合名字byName
@Nullable 字段标记了这个注解,说明这个字段可以为null
如果Autowired的环境比较复杂,可以使用@Qualifier(value="XXX")指定装配
@Resource注解
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
标签:--,Spring,private,bean,import,注入
From: https://www.cnblogs.com/depressiom/p/16945294.html