首页 > 代码库 > Spring总结(一)

Spring总结(一)

1.核心

spring核心有两个IOC(控制反转),AOP(面向切面)

2.理解

在我的理解以前的mvc之间的各个类都是互相耦合的,举个例子:在service里面newdao来进行各种调用。这样的话每个都是相互依赖的关系。

为了解决这种情况,就需要一个中间的第三方容器来解耦,而这就是spring的用处了

3.导入jar

在有原来的各个类主动new出依赖类,到变成被动的由第三方容器主动注入,这就是IOC,而注入的过程就是依赖注入了

4+1:4个核心(beanscorecontextexpression+ 1个依赖(commons-loggins...jar)

4.bean.xml配置

位置:任意,开发中一般在classpath下(src

l 名称:任意,开发中常用applicationContext.xml

l 内容:添加schema约束

约束文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\ xsd-config.html

 

<?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">

<!-- 配置service

<bean> 配置需要创建的对象

id :用于之后从spring容器获得实例时使用的

class :需要创建实例的全限定类名

-->

<bean id="userServiceId" class="com.itheima.a_ioc.UserServiceImpl"></bean>

</beans>

使用方法

Test

public void demo02(){

//spring容器获得

//1 获得容器

String xmlPath = "com/itheima/a_ioc/beans.xml";

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

//2获得内容 --不需要自己new,都是从spring容器获得

UserService userService = (UserService) applicationContext.getBean("userServiceId");

userService.addUser();

 

}

 

 

5.依赖注入

示例代码

 

<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">

<!--

模拟spring执行过程

创建service实例:BookService bookService = new BookServiceImpl() IoC  <bean>

创建dao实例:BookDao bookDao = new BookDaoImpl() IoC

dao设置给servicebookService.setBookDao(bookDao); DI   <property>

 

<property> 用于进行属性注入

namebean的属性名,通过setter方法获得

setBookDao ##> BookDao  ##> bookDao

ref :另一个beanid值的引用

 -->

 

<!-- 创建service -->

<bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">

<property name="bookDao" ref="bookDaoId"></property>

</bean>

 

<!-- 创建dao实例 -->

<bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>

 

 

</beans>

@Test

public void demo01(){

//spring容器获得

String xmlPath = "com/itheima/b_di/beans.xml";

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

BookService bookService = (BookService) applicationContext.getBean("bookServiceId");

 

bookService.addBook();

 

}

 

小结:

先是在xml里面配置通过property标签进行配置,前者是setter方法里面对应的变量名,后者是daobeanid,两者进行映射

 

6.Bean的三种创建方式

默认构造

<bean id="" class="">  必须提供默认构造

 

静态工厂

l 常用与spring整合其他框架(工具)

l 静态工厂:用于生成实例对象,所有的方法必须是static

<bean id=""  class="工厂全限定类名"  factory-method="静态方法">

 

工厂

public class MyBeanFactory {

 

/**

 * 创建实例

 * @return

 */

public static UserService createService(){

return new UserServiceImpl();

}

}

 

.实例工厂

l 实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。

 

工厂

/**

 * 实例工厂,所有方法非静态

 *

 */

public class MyBeanFactory {

 

/**

 * 创建实例

 * @return

 */

public UserService createService(){

return new UserServiceImpl();

}

 

}

Xml配置

示例

 

 

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

<bean id="myBeanFactoryId" class="com.itheima.c_inject.c_factory.MyBeanFactory"></bean>

<!-- 获得userservice 

* factory-bean 确定工厂实例

* factory-method 确定普通方法

-->

<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>

 

作用域scope

singleton 单例,默认值。

prototype 多例,每执行一次getBean将获得一个实例。

7.注入的几种方式:

构造方法注入

首先呢,domain里的类得有构造方法

如:

public class User {

 

private Integer uid;

private String username;

private Integer age;

 

public User(Integer uid, String username) {

super();

this.uid = uid;

this.username = username;

}

 

public User(String username, Integer age) {

super();

this.username = username;

this.age = age;

}

 

然后在xml进行配置

<!-- 构造方法注入

* <constructor-arg> 用于配置构造方法一个参数argument

name :参数的名称

value:设置普通数据

ref:引用数据,一般是另一个bean id

 

index :参数的索引号,从0开始 。如果只有索引,匹配到了多个构造方法时,默认使用第一个。

type :确定参数类型

例如:使用名称name

<constructor-arg name="username" value="http://www.mamicode.com/jack"></constructor-arg>

<constructor-arg name="age" value="http://www.mamicode.com/18"></constructor-arg>

例如2【类型type 和  索引 index

<constructor-arg index="0" type="java.lang.String" value="http://www.mamicode.com/1"></constructor-arg>

<constructor-arg index="1" type="java.lang.Integer" value="http://www.mamicode.com/2"></constructor-arg>

-->

<bean id="userId" class="com.itheima.f_xml.a_constructor.User" >

<constructor-arg index="0" type="java.lang.String" value=http://www.mamicode.com/"1"></constructor-arg>

<constructor-arg index="1" type="java.lang.Integer" value=http://www.mamicode.com/"2"></constructor-arg>

</bean>

Sette方法注入

这个就是之前在依赖注入里讲到的那种。

集合注入

<!--

集合的注入都是给<property>添加子标签

数组:<array>

List<list>

Set<set>

Map<map> map存放k/v 键值对,使用<entry>描述

Properties<props>  <prop key=""></prop>  【】

 

普通数据:<value>

引用数据:<ref>

-->

<bean id="collDataId" class="com.itheima.f_xml.e_coll.CollData" >

<property name="arrayData">

<array>

<value>DS</value>

<value>DZD</value>

<value>屌丝</value>

<value>屌中屌</value>

</array>

</property>

 

<property name="listData">

<list>

<value>于嵩楠</value>

<value>曾卫</value>

<value>杨煜</value>

<value>曾小贤</value>

</list>

</property>

 

<property name="setData">

<set>

<value>停封</value>

<value>薄纸</value>

<value>关系</value>

</set>

</property>

 

<property name="mapData">

<map>

<entry key="jack" value=http://www.mamicode.com/"杰克"></entry>

<entry>

<key><value>rose</value></key>

<value>肉丝</value>

</entry>

</map>

</property>

 

<property name="propsData">

<props>

<prop key="高富帅">嫐</prop>

<prop key="白富美">嬲</prop>

<prop key="男屌丝">挊</prop>

</props>

</property>

</bean>

 

 

 

 ps:由于晚上打的,时间不够,就直接复制了代码了= =!

 

Spring总结(一)