Spring

Spring概念

1) Spring是开源的轻量级框架

2) Spring核心主要有两部分

     * aop: 面向切面编程, 扩展功能不用修改源代码实现

     *ioc: 控制反转, 比如有一个类, 在类里面有方法(不是静态方法), 调用类里面的方法时, 需要创建类的对象, 使用对象调用方法, 创建类对象的过程, 通过new出来对象

      ioc是把对象的创建不是通过new方式实现, 而是交给Spring配置创建类对象

3) Spring是一站式框架

    * Spring在javaee三层结构中, 每一层都提供不同的解决技术

       web层: SpringMVC

       service层: Spring的ioc

       dao层: Spring的jdbcTemplate

 

Spring的Bean管理(xml方式)

Bean实例化的方式

(1) 在Spring里面通过配置文件创建对象

(2) Bean实例化的三种方式实现

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

<bean id="user" class="com.aitsys.demo.controller.User"></bean>

类里面没有无参构造会抛异常

第二种 使用静态工厂创建

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

package com.spring;
/**
* Created by gailun on 2018/7/25.
*/
public class Bean2 {

    public void add(){
        System.out.println("Bean2...........");
    }
}
package com.spring;
/**
* Created by gailun on 2018/7/25.
*/
public class Bean2Factory {
    //静态的方法, 返回Bean2对象
    public static Bean2 getBean2(){
        return new Bean2();
    }
}
<?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"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


        <!--使用静态工厂创建对象-->
        <bean id="bean2" class="com.spring.Bean2Factory" factory-method="getBean2"></bean>
</beans>
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by gailun on 2018/7/25.
*/
public class Bean2Test {
    public static void main(String[] args) {
        //1.加载spring配置文件, 根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到配置创建的对象
        Bean2 bean2 = (Bean2) context.getBean("bean2");
        System.out.println(bean2);
    }
}

执行结果:

第三种 使用实例化工厂创建

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

package com.spring;
/**
* Created by gailun on 2018/7/25.
*/
public class Bean3 {
    public void add(){
        System.out.println("Bean3...........");
    }
}
package com.spring;
/**
* Created by gailun on 2018/7/25.
*/
public class Bean3Factory {
    //普通的方法, 返回Bean3对象
    public Bean3 getBean3(){
        return new Bean3();
    }
}
<?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"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


        <!--使用静态工厂创建对象-->
        <bean id="bean2" class="com.spring.Bean2Factory" factory-method="getBean2"></bean>

        <!--使用实例化工厂创建对象-->
        <!--创建工厂对象-->
        <bean id="beanFactory" class="com.spring.Bean3Factory"></bean>
        <bean id="bean3" factory-bean="beanFactory" factory-method="getBean3"></bean>
</beans>
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by gailun on 2018/7/25.
*/
public class Bean3Test {
    public static void main(String[] args) {
        //1.加载spring配置文件, 根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到配置创建的对象
        Bean3 bean3 = (Bean3) context.getBean("bean3");
        System.out.println(bean3);
    }
}

执行结果:

(3) Bean标签常用属性

1) id属性: 起名称, id属性值名称任意命名;  id属性值不能包含特殊符号; 根据id值得到配置对象

2) class属性: 创建对象所在类的全路径

3) name属性: 功能和id属性一样的, id属性值不能包含特殊符号, 但是在name属性值里面可以包含特殊符号

4) scope属性:

(4) 属性注入

1) 创建对象时候, 向类里面属性里面设置值

2) 属性注入的方式介绍(三种方式)

    * 使用set方法注入

 

    * 使用有参数构造注入

    * 使用接口注入

3) 在Spring框架里面, 支持前两种方式

    * set 方法注入

    * 有参数构造注入

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

在service得到dao对象

具体实现过程:

1) 在service里面把dao作为类型属性

2) 生成dao类型属性的set方式

package com.spring;
/**
* Created by gailun on 2018/7/26.
*/
public class UserDao {
    public void add(){
        System.out.println("dao..............");
    }
}
package com.spring;
/**
* Created by gailun on 2018/7/26.
*/
public class UserService {
    //1. 定义dao类型属性
    private UserDao userDao;

    //2. 生成set方法
    public void setUserDao(UserDao userDao){
        this.userDao=userDao;
    }

    public void add(){
        System.out.println("service.........");
        //在service里面得到dao类对象, 才能调用dao里面的方法
        userDao.add();
    }
}

3) 配置文件中注入关系

<!--注入对象类型属性-->
<!--1.配置service和dao对象-->
<bean id="userDao" class="com.spring.UserDao"></bean>
<bean id="userService" class="com.spring.UserService">
     <!--注入dao属性,
                name属性值: service类里面属性名称;
        现在不要写value属性, 因为刚才是字符串, 现在是对象;
        写ref属性: dao配置bean标签中id值-->
     <property name="userDao" ref="userDao"></property>
</bean>

(6) P 名称空间注入

<?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:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


        <!--使用静态工厂创建对象-->
        <bean id="bean2" class="com.spring.Bean2Factory" factory-method="getBean2"></bean>

        <!--使用实例化工厂创建对象-->
        <!--创建工厂对象-->
        <bean id="beanFactory" class="com.spring.Bean3Factory"></bean>
        <bean id="bean3" factory-bean="beanFactory" factory-method="getBean3"></bean>

        <!--注入对象类型属性-->
        <!--1.配置service和dao对象-->
        <bean id="userDao" class="com.spring.UserDao"></bean>
        <bean id="userService" class="com.spring.UserService">
             <!--注入dao属性,
                name属性值: service类里面属性名称;
        现在不要写value属性, 因为刚才是字符串, 现在是对象;
        写ref属性: dao配置bean标签中id值-->
             <property name="userDao" ref="userDao"></property>
        </bean>

        <!--p名称空间注入-->
        <bean id="person" class="com.spring.Person" p:pname="pname"></bean>
</beans>
package com.spring;
/**
* Created by gailun on 2018/7/27.
*/
public class Person {
    private String pname;

    public void setPname(String pname) {
        this.pname = pname;
    }

    public void test1(){
        System.out.println("person....."+pname);
    }
}
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by gailun on 2018/7/27.
*/
public class PersonTest {
    public static void main(String[] args) {
        //1.加载spring配置文件, 根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到配置创建的对象
        Person person = (Person) context.getBean("person");
        System.out.println(person);
    }
}

执行结果:

(7) 注入复杂类型

1) 数组

2) list集合

3) map集合

4) properties类型

?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:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


        <!--使用静态工厂创建对象-->
        <bean id="bean2" class="com.spring.Bean2Factory" factory-method="getBean2"></bean>

        <!--使用实例化工厂创建对象-->
        <!--创建工厂对象-->
        <bean id="beanFactory" class="com.spring.Bean3Factory"></bean>
        <bean id="bean3" factory-bean="beanFactory" factory-method="getBean3"></bean>

        <!--注入对象类型属性-->
        <!--1.配置service和dao对象-->
        <bean id="userDao" class="com.spring.UserDao"></bean>
        <bean id="userService" class="com.spring.UserService">
             <!--注入dao属性,
                name属性值: service类里面属性名称;
        现在不要写value属性, 因为刚才是字符串, 现在是对象;
        写ref属性: dao配置bean标签中id值-->
             <property name="userDao" ref="userDao"></property>
        </bean>

        <!--p名称空间注入-->
        <!--<bean id="person" class="com.spring.Person" p:pname="pname"></bean>-->

        <!--注入复杂类型属性值-->
        <bean id="person" class="com.spring.Person">
            <!--数组-->
            <property name="arrs">
                <list>
                    <value>生活</value>
                    <value>吃饭</value>
                    <value>奋斗</value>
                </list>
            </property>

            <!--list-->
            <property name="list">
                <list>
                    <value>小生</value>
                    <value>小吃</value>
                    <value>小奋</value>
                </list>
            </property>

            <!--map-->
            <property name="map">
                <map>
                    <entry key="aa" value="lucy"></entry>
                    <entry key="bb" value="tom"></entry>
                    <entry key="cc" value="mali"></entry>
                </map>
            </property>

            <!--properties-->
            <property name="properties">
                <props>
                    <prop key="driverclass">com.mysql.jdbc.Driver</prop>
                    <prop key="username">root</prop>
                    <prop key="password">root</prop>
                </props>
            </property>

        </bean>
</beans>
package com.spring;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* Created by gailun on 2018/7/27.
*/
public class Person {
    private String pname;

    public void setPname(String pname) {
        this.pname = pname;
    }

    private String[] arrs;
    private List<String> list;
    private Map<String,String> map;
    private Properties properties;

    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 test1(){
        System.out.println("person....."+pname);
        System.out.println("arrs:"+arrs);
        System.out.println("list:"+list);
        System.out.println("map:"+map);
        System.out.println("properties:"+properties);
    }
}
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by gailun on 2018/7/27.
*/
public class PersonTest {
    public static void main(String[] args) {
        //1.加载spring配置文件, 根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到配置创建的对象
        Person person = (Person) context.getBean("person");
        person.test1();

    }
}

执行结果:

(8) IOC和DI区别

1) IOC: 控制反转, 把对象创建交给spring进行配置

2) DI: 依赖注入, 向类里面的属性中设置值

3) 关系: 依赖注入不能单独存在, 需要在IOC基础之上完成操作

(9) Spring整合web项目原理

1) 加载spring核心配置文件

//1.加载spring配置文件, 根据创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

2) new对象, 功能可以实现, 效率很低

3) 实现思想: 把加载配置文件和创建对象过程, 在服务器启动时候完成

4) 实现原理

    * ServletContext对象

    * 监听器

    * 具体使用:

    在服务器启动时候, 为每个项目创建一个ServletContext对象

    在ServletContext对象创建时候, 使用监听器可以具体到ServletContext对象在什么时候创建

    使用监听器监听到ServletContext对象

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

    把创建出来的对象放到ServletContext域对象里面(setAttribute()方法)

     获取对象时候, 到ServletContext域得到(getAttribute()方法)

(10) Spring的Bean管理(注解)

注解介绍:

                * 代码里面特殊标记, 使用注解可以完成相关的功能

                * 注解写法@注解名称(属性名称=属性值)

                * 注解使用在类上面, 方法上面 和属性上面

Spring注解开发准备:

* 导入基本的jar包

 * 导入aop的jar包

 * 创建类, 创建方法

package com.spring;
/**
* Created by gailun on 2018/7/28.
*/
public class User {
    public void add(){
        System.out.println("add.............");
    }
}

   * 创建spring配置文件, 引入约束

<?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:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


       
</beans>

* 开启注解扫描

<!--开启注解扫描-->
<context:component-scan base-package="com.spring"></context:component-scan>

1) 使用注解创建对象

* 在创建对象的类上面使用注解实现

package com.spring;
import org.springframework.stereotype.Component;

/**
* Created by gailun on 2018/7/28.
*/
@Component(value = "user") // 等价于 <bean id="user" class="/>
public class User {
    public void add(){
        System.out.println("add.............");
    }
}
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by gailun on 2018/7/28.
*/
public class UserTest {
    public static void main(String[] args) {
        //1.加载spring配置文件, 根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        User user = (User) context.getBean("user");
        user.add();
    }
}

执行结果:

* 创建对象单实例还是多实例

@Component(value = "user") // 等价于 <bean id="user" class="/>
@Scope(value = "prototype")
public class User {

2) 使用注解注入属性

package com.spring;
import org.springframework.stereotype.Component;
/**
* Created by gailun on 2018/7/28.
*/
@Component(value = "userDao")
public class UserDao1 {
    public void add(){
        System.out.println("UserDao1.............");
    }
}
package com.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Created by gailun on 2018/7/28.
*/
@Service(value = "userService")
public class UserService1 {

    //得到dao对象
    //1.定义Dao类型属性
    //在dao属性上面使用注解完成对象注入
    @Autowired
    private UserDao1 userDao1;
    //使用注解方式时候不需要set方法
    public void add(){
        System.out.println("UserService1...........");
        userDao1.add();
    }
}
package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by gailun on 2018/7/28.
*/
public class UserTest {
    public static void main(String[] args) {
        //1.加载spring配置文件, 根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        //User user = (User) context.getBean("user");
        //user.add();
        UserService1 userService1 =(UserService1) context.getBean("userService");
        userService1.add();
    }
}

执行结果:

3) xml和注解方式混合使用

(11) AOP

1) aop概述

* aop: 面向切面(方面)编程, 扩展功能不修改源代码实现

* aop: 采取横向抽取机制, 取代了传统纵向继承体系重复性代码

2) aop底层原理

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值