Spring——控制反转(IOC)和面向切面(AOP)

可以将所有的对象创建和依赖关系维护交给Spring管理的AOP编程支持

Spring 提供的切面编程可以方便的实现对程序进行权限拦截,运行监控等声明式事物的支持。

Spring支持Junit4,方便测试。

IOC的底层实现原理

IOC将对象的创建权反转给Spring,实现程序的解耦合。

spring是轻量级开源框架

 

 spring核心有两部分:

1)控制反转 ioc

* 比如现在有普通类,在这个类里面有普通的方法,调用这个类里面的普通的方法,需要创建类对象,使用对象调用方法。

* 创建类的对象,使用原始方式new对象。使用ioc实现对象创建,不需要手动new对象,通过配置文件方式创建对象

** 把对象创建交给spring配置

 

2)面向切面 aop

* 不通过修改源代码方式增强类里面的方法

* aop底层动态代理

 

 spring是一站式框架

1spring针对javaee三层,在每一层提供解决技术

* web层:springMVC

* service:  spring ioc

* dao层:spring jdbcTemplate

ioc称为控制反转,把对象创建不是new出来,而是在spring使用配置方式创建

 IOC入门案例

1 创建普通类,在这个类里面创建普通的方法,调用类里面的方法

 

第一步 导入spring相关jar

1)使用spring框架,核心有四个部分(四个jar包)

* beansspring配置文件相关配置

* core:核心部分

* contextspring注解

* SpEL : spring表达式

 

第二步 创建类,创建普通的方法

 

第三步 创建spring配置文件,配置user对象创建

 

spring配置文件配置对象

    <!-- 配置user对象

       id: 根据id值获取对象

       class: 要创建对象所在类全路径

    -->

    <bean id="user" class="cn.itcast.ioctest.User"></bean>

 

第四步 测试如何获取配置出来的user对象

    @Test

    public void testUser() {

       //1 加载spring配置文件

       /*

        * 加载spring配置文件,把配置对象创建

        * */

       ApplicationContext context =

              new ClassPathXmlApplicationContext("bean1.xml");

       //2 根据id值获取对象

//     User user1 = context.getBean("user",User.class);

       User user = (User) context.getBean("user");

       System.out.println(user);

       user.add();

    }

 

Spring的bean管理(xml方式)

什么是bean管理

两个操作:

1)创建对象(bean实例化)

2)设置类里面属性值(注入属性)

 

springbean管理有两种方式

1)基于xml配置文件方式

2)基于注解方式

 

1 spring里面通过配置文件创建对象

1)创建对象操作

 

2 bean实例化(创建对象)三种方式实现

第一种 使用类的无参数构造创建(重点)

 

第二种 使用静态工厂创建(了解)

1)创建静态的方法,返回类对象

 

第三种 使用实例工厂创建(了解)

1)创建不是静态的方法,返回类对象

bean标签常用属性

1 id属性

1)根据id属性值获取对象

2)在一个spring配置文件中,可以有多个bean标签,但是bean标签id属性值不同

 

2 class属性

1)类的全路径

 

3 name属性

1name属性作用和id属性一样的

2id属性值里面不能包含特殊符号的

3name属性值可以包含特殊符号  /user

 

4 scope属性

1)主要作用:配置创建对象是单实例还是多实例对象

2)属性值:

* 默认值,singleton,表示单实例对象

* prototype,表示多实例对象

** action是多实例对象

 

request:把创建对象放到request里面

session:把创建对象放到session里面

globalSession:把创建对象放到globalSession里面

** 单点登录

spring配置文件在服务器启动时候加载最合适,创建对象

底层原理:

* ServletContext对象:当服务器启动时候,每个项目有一个ServletContext对象,是整个web项目范围的域对象

* 监听器:监听ServletContext对象创建和销毁

 

2)在开发中,一般让配置文件在服务器启动时候加载,把配置文件中对象创建

Bean生命周期配置(了解)

1 创建servlet时候,执行init方法

2 销毁servlet时候,执行destory方法

 

属性注入介绍

1 在类里面有属性,向类里面属性中设置值,这个过程称为属性注入

 

2 向类里面属性中设置值,在java代码中有三种方式实现

 

3 spring框架里面支持是set方法注入和有参数构造注入

1)常用set方法注入

使用有参数构造注入

1 创建类,定义属性,生成有参数构造

/**

 * 有参数构造注入

 * @author asus

 *

 */

public class Book {

    private String bname;

    private String author;

   

    //生成有参数构造

    public Book(String bname, String author) {

       this.bname = bname;

       this.author = author;

    }

   

    public void add() {

       System.out.println("book:"+bname+"::"+author);

    }

}

 

2 配置属性注入

    <!-- 使用有参数构造注入 -->

    <bean id="book" class="cn.itcast.attr.Book">

       <!-- 体现有参数构造

           name: 属性名称

           value:设置值

       -->

       <constructor-arg name="bname" value="易筋经"></constructor-arg>

       <constructor-arg name="author" value="小王"></constructor-arg>

    </bean>

使用set方法注入(重点)

1 创建类,定义属性,生成属性set方法

/**

 * set方法注入

 * @author asus

 *

 */

public class Orders {

 

    private String oname;

    private String oaddress;

    //生成set方法

    public void setOname(String oname) {

       this.oname = oname;

    }

    public void setOaddress(String oaddress) {

       this.oaddress = oaddress;

    }

   

    public void add() {

       System.out.println("orders:"+oname+"::"+oaddress);

    }

}

 

2 配置属性注入

    <!-- set方法注入 -->

    <bean id="orders" class="cn.itcast.attr.Orders">

       <!-- name: 属性名称

           value:设置值 -->

       <property name="oname" value="洗髓经"></property>

       <property name="oaddress" value="嵩山"></property>

    </bean>

注入对象类型属性(重点)

第一步 service定义dao类型属性

public class UserService {

   

    //目的:在service获取dao对象

    //dao对象注入到service

   

    //1 定义UserDao类型属性

    private UserDao userDao;

    //2 生成set方法

    public void setUserDao(UserDao userDao) {

       this.userDao = userDao;

    }

 

第二步 实现配置

  

 

 

 

 

 

 

 

p名称空间注入(了解)

1 引入p名称空间

2 配置文件中,使用名称空间注入属性

 

1spring2.x以下版本,不能使用p名称空间注入

spring分模块配置开发

1 在代码里面加载配置时候时候,引入多个配置文件

 

2 在配置文件引入其他spring配置文件

注入复杂类型属性(会用)

1 数组

2 List集合

3 Map集合

4 Properties

/**

 * 复杂类型属性

 * @author asus

 *

 */

public class Customer {

 

    //定义属性

    private String[] arrs;

    private List<String> list;

    private Map<String,String> map;

    private Properties properties;

    //set方法

    public void setArrs(String[] arrs) {

       this.arrs = arrs;

    }

    public void setList(List<String> list) {

       this.list = list;

    }

    public void setMap(Map<String, String> map) {

       this.map = map;

    }

    public void setProperties(Properties properties) {

       this.properties = properties;

    }

   

    public void find() {

       System.out.println("arrs: "+Arrays.toString(arrs));

       System.out.println("list: "+list);

       System.out.println("map: "+map);

       System.out.println("properties: "+properties);

    }

}

 

    <bean id="customer" class="cn.itcast.attr.Customer">

       <!-- 数组 -->

       <property name="arrs">

           <list>

              <value>lucy</value>

              <value>mary</value>

              <value>jack</value>

           </list>

       </property>

      

       <!-- list -->

       <property name="list">

           <list>

              <value>小王</value>

              <value>小金</value>

              <value>小奥</value>

           </list>

       </property>

      

       <!-- map-->

       <property name="map">

           <map>

              <entry key="football" value="足球"></entry>

              <entry key="basketball" value="篮球"></entry>

           </map>

       </property>

      

       <!-- properties -->

       <property name="properties">

           <props>

              <prop key="driverClass">com.mysql.jdbc.Driver</prop>

              <prop key="jdbcUrl">jdbc:mysql:///day01</prop>

           </props>

       </property>

    </bean>

 

 IOC和DI区别

1 ioc:控制反转,把对象创建不是new出来的,通过spring配置出来的

1spring创建对象

 

2 di:依赖注入

1)属性注入,向类里面属性中设置值

 

3 iocdi关系:

1di需要在ioc基础之上完成

2)向类里面设置属性值,首先创建类的对象,使用对象才可以设置

猜你喜欢

转载自blog.csdn.net/marjianjiandandan/article/details/81226210