Spring基础学习(一)
一 、spring核心功能
- IoC/DI 控制反转/依赖注入
- AOP 面向切面编程
- 声明式事物
二 、spring框架的runtime
-
test spring 提供测试功能
-
Core Container 核心容器 spring启动最基本的条件
Beans:spring负责创建类对象并管理对象
Core:核心类
Context :上下文参数,获取外部资源或管理注解等
SpEI:expression.jar
-
AOP:实现AOP 功能功能需要的依赖
-
Aspects:切面AOP依赖的包
-
Data Access/Integration:spring封装数据访问层相关内容
JDBC:spring对JDBC封装后的代码
ORM:封装了持久层框架的代码,例如:Hibernate
transactions:对应spring-tx.jar声明事务使用
-
WEB:需要spring完成web相关功能时需要
由Tomcat加载spring配置文件时需要有spring-web包
三、IoC是什么?
- IoC完成的事情由原先程序员主动通过new实例化对象的事情,交给spring负责
- 控制反转中控制指的是:控制类的对象
- 控制反转中反转指的是转交给spring负责
- IoC最大的作用:解耦 程序员不需要管理对象,解除了对象管理和程序员之间的耦合
四、spring环境搭建
-
导入jar(四个核心包+一个日志包)
-
在src 目录下新建applicationContext.xml(applicationContext.xml配置的信息最终存储到ApplicationContext容器中)
-
配置文件中只需要引入基本的schema
-
通过 bean 创建对象
-
默认配置文件被加载时创建对象
<?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.xsd"> <!-- id表示获取到对象标 class创建哪个类的对象 --> <!--设置无参的构造方法--> <bean id="people" class="com.bjsxt.pojo.People"/>
-
4.编写测试类方法
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = ac.getBean("peo1",People.class);
System.out.println(people);
String[] names = ac.getBeanDefinitionNames();
}
}
注:
- getBean(“标签id”,返回值类型);如果没有第二个参数,默认为Object
- getBeanDefinitionNames(),spring容器中目前所有管理的所有对象
五、spring创建对象的三种方法
1 通过构造方法创建
-
无参构造创建:默认情况
-
有参构造创建:需要明确的配置(在applicationContext.xml中设置调用哪个构造方法创建对象,如果设定的条件匹配多个构造方法,则执行最后的构造方法)
1 index :参数的索引,从0开始
2 name:参数名
3 type:类型(区分开关键字和封装类 int和Integer)<!--设置无参的构造方法--> <bean id="people" class="com.bjsxt.pojo.People"/> <!--设置有参的构造方法 --> <bean id="peo" class="com.bjsxt.pojo.People"> <constructor-arg index="0" name="id" value="123"></constructor-arg> <constructor-arg index="1" name="name" value="张丹"></constructor-arg> </bean>
2 通过实例工厂创建
- 帮助创建类对象,一个工厂可以产生多个对象
- 需要先创建工厂,才可以产生对象
- 实现
(1)创建实例工厂
public class PeopleFactory {
public People newInstance(){
return new People(1,"测试");
}
}
(2)在applicationContext.xml中配置工厂对象和需要创建的对象
<bean id="factory" class="com.bjsxt.factory.PeopleFactory "></bean>
<bean id="p" factory-bean="factory" factory-method="newInstance"></bean>
3 通过静态工厂创建
-
不需要创建工厂,快速创建对象
-
实现
(1)编写一个静态工厂(在方法中添加static)
public class PeopleStaticFactory { public static People newInstance(){ return new People(2,"测试"); } }
(2)在applicationContext.xml中配置
<!--静态工厂 --> <bean id="peo2" class="com.bjsxt.factory.PeopleStaticFactory" factory-method="newInstance"></bean>
六、如何给Bean的属性赋值(注入)
-
pojo类
public class People { private int id; private String name; private Set<String> sets; private List<String> list; private String [] strs; private Map<String,String> map; @Override public String toString() { return "People{" + "id=" + id + ", name='" + name + '\'' + ", sets=" + sets + ", list=" + list + ", strs=" + Arrays.toString(strs) + ", map=" + map + '}'; } public People() { System.out.println("执行无参构造方法"); } public People(int id) { this.id = id; System.out.println("执行有一个参数的构造方法"); } public People(String name,int id) { this.id = id; this.name = name; System.out.println("执行有两个参数的顺序不同构造方法"); } public People(int id, String name) { this.id = id; this.name = name; System.out.println("执行有两个参数的构造方法"); } }
-
在applicationContext.xml中配置
<bean id="ppp" class="com.bjsxt.pojo.People"> <property name="id" value="222"></property> <property name="name" value="张三"></property> <property name="map"> <map> <entry key=" a" value="aa"></entry> <entry key=" b" value="bb"></entry> <entry key=" c" value="cc"></entry> <entry key=" d" value="dd"></entry> </map> </property> <property name="list"> <list> <value>1</value> <value>2</value> </list> </property> <property name="sets"> <set> <value>1</value> <value>2</value> <value>3</value> <value>4</value> </set> </property> <property name="strs" > <array> <value>1</value> <value>2</value> <value>3</value> </array> </property> </bean>
如果list只有一个值
<property name="list" value="1"></property>
七、 如何给Bean的属性赋值(注入)
-
DI:当一个类(A)需要依赖另一个类(B)的对象时,把B赋值给A的过程就是依赖注入
-
实现
<bean id="peo3" class="com.bjsxt.pojo.People"> <property name="desk" ref="desk"></property> </bean> <bean id="desk" class="com.bjsxt.pojo.Desk "> <property name="id" value="1"></property> <property name="price" value="12"></property> </bean>