码迷,mamicode.com
首页 > 编程语言 > 详细

Spring

时间:2017-07-31 20:02:13      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:运行时   books   service   成员变量   span   context   bsp   expected   引用   

spring 

①Spring是一个开源框架

③Spring是一个IOC(DI)和AOP容器框架。

④Spring的优良特性

[1]非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API

[2]依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。

[3]面向切面编程:Aspect Oriented Programming——AOP

[4]容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期

        [5]组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。

        [6]一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。

⑥Spring模块

 

 

1           安装Spring插件

①插件包:springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite.zip

②操作步骤:参照《参考资料:Spring插件安装图解.pptx》

 

2           搭建Spring运行时环境

①加入JAR包

         [1]Spring自身JAR包:spring-framework-4.0.0.RELEASE\libs目录下

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

         [2]commons-logging-1.1.1.jar

②根据需要创建Spring配置文件

    /**
     * 细节:IOC容器中所有的组件默认是单例的;
     * 1、组件的创建对象是容器创建的;
     * 2、注册的组件,是在容器创建完全完成之前容器帮我们就创建好了;
     * 3、容器中创建的对象都是单例模式;多次获取都是获取之前创建好的对象;
     * 4、如果按照id获取,不存在,会抛出异常;
     * org.springframework.beans.factory.
     * NoSuchBeanDefinitionException: 
     * No bean named ‘person02‘ is defined
     * 
     * 5、如果按照类型,这个类型的组件在容器中有多个,抛异常
     * org.springframework.beans.factory.
     * NoUniqueBeanDefinitionException: 
     * No qualifying bean of type [com.atguigu.bean.Person] 
     * is defined: expected single matching bean but found 2: 
     * person01,person02
     * 
     * 6、property是利用set方法赋值的,如果没有set方法也就坏了;
     * 
     */
    @Test
    public void test() {
        //1、实验1:通过IOC容器创建对象,并为属性赋值★
        //1、从容器中获取刚才注册的组件;
        //1)、根据配置文件获取到容器对象
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        System.out.println("容器创建完成.....");
        //2)、从容器中获取组件即可,按照组件的id获取
        System.out.println("获取bean之前");
        Person bean = (Person) ioc.getBean("person01");
        System.out.println("获取bean之后");
        
        
        Person bean2 = (Person) ioc.getBean("person01");
        //3)、容器帮我们创建好了对象
        System.out.println(bean == bean2);
        
        
//        Person bean3 = (Person) ioc.getBean("person02");
//        System.out.println(bean3);
        
        //实验2:根据bean的类型从IOC容器中获取bean的实例★
        Person person = ioc.getBean(Person.class);
        System.out.println("按照类型的:"+person);
    }

 

 实验:

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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 引用外部属性文件
    ioc容器中配置的所有组件,默认都是单实例 ,spring容器管理数据库连接池
    c3p0-0.9.1.2.jar
    mysql-connector-java-5.1.7-bin.jar
    -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="root"></property>
        <property name="password" value="537423Ab"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/bookstore"></property>
    </bean>

</beans>

test

public class test {
    //将IOC容器本身实例化
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
    @Test
    public void test() throws SQLException {
       //1、按照类型获取
        //它会获得这个类型下的所有实现或者子类的对象
        //ComboPooledDataSource是DataSource的实现
        //确保只有一个DataSource配置在xml中
        DataSource bean = ioc.getBean(DataSource.class);
        Connection connection = bean.getConnection();
        System.out.println(connection);
    }

}

 

 

/ComboPooledDataSource是DataSource的实现类

技术分享

实验:配置外部属性文件*****

 

1.1          引用外部属性文件

当bean的配置信息逐渐增多时,查找和修改一些bean的配置信息就变得愈加困难。这时可以将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时仅修改properties属性文件即可。这种技术多用于连接数据库的基本信息的配置。

①直接配置

<!-- 直接配置 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="user" value="root"/>

    <property name="password" value="root"/>

    <property name="jdbcUrl" value="jdbc:mysql:///test"/>

    <property name="driverClass" value="com.mysql.jdbc.Driver"/>

</bean>

 

②创建properties属性文件

prop.userName=root

prop.password=root

prop.url=jdbc:mysql:///test

prop.driverClass=com.mysql.jdbc.Driver

 

③引入context名称空间

 

 

④指定properties属性文件的位置

<!-- 指定properties属性文件的位置 -->

<!-- classpath:xxx 表示属性文件位于类路径下 -->

<context:property-placeholder location="classpath:jdbc.properties"/>

 

⑤从properties属性文件中引入属性值

<!-- 从properties属性文件中引入属性值 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="user" value="${prop.userName}"/>

    <property name="password" value="${prop.password}"/>

    <property name="jdbcUrl" value="${prop.url}"/>

    <property name="driverClass" value="${prop.driverClass}"/>

</bean>

 

/**
     * 实验18:使用@Autowired注解实现根据类型实现自动装配★
     * 原理:
     * 1、先按照类型进行匹配:匹配上就赋值;
     *         按照类型找不到:(报错)
     *             org.springframework.beans.factory.BeanCreationException: 
     *             Error creating bean with name ‘bookServlet‘: 
     *             Injection of autowired dependencies failed; 
     *     Caused by: org.springframework.beans.factory.
     *             NoSuchBeanDefinitionException: 
     *             No qualifying bean of type 
     *             [com.atguigu.service.BookService] 
     *             found for dependency: 
     *             expected at least 1 bean which qualifies as autowire candidate for this dependency. 
     * 
     *         2、如果按照类型找到多个:(如一个接口下有多个实现)
     *             1)、属性名作为id继续去ioc容器中查找找到既赋值;
     *                 找id为bookService的对象;
     *             2)、找到就装配上
     *             3)、找不到:报错
     * org.springframework.beans.factory.BeanCreationException:
     * Caused by: org.springframework.beans.factory.BeanCreationException: 
     * Could not autowire field: 
     * private com.atguigu.service.BookService com.atguigu.servlet.BookServlet.bookServiceImpl001; 
     * Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
     * No qualifying bean of type [com.atguigu.service.BookService] is defined: 
     * expected single matching bean but found 2: 
     * bookService,bookServiceImpl
     *                     
     * 
     * 
     * 3、各种找不到情况;
     * 
     * 使用@Autowired自动赋值
     * 如果找到多个属性名会作为id继续查找;可以指定别用属性名做id了
     * @Qualifier("bookServiceImpl")指定新的id作为去容器中查找的依据
     * 
     * @Autowired  的效果,一定要装配上。赋值不上就报错
     * 
     * 实验22:@Autowired注解的required属性指定某个属性允许不被设置
     * @Autowired(required=false)能装上就装,不行就算了;

 

1           泛型依赖注入

1.1          简介

Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用。

 

1.2          实现

[1]组件基类

BaseRepository

public class BaseRepository<T> {

   

    public void save() {

       System.out.println("Saved by BaseRepository");

    }

 

}

 

BaseService

public class BaseService<T> {

   

    @Autowired

    private BaseRepository<T> repository;

   

    public void add() {

       repository.save();

    }

 

}

 

[2]组件实体类

UserRepository

@Repository

public class UserRepository extends BaseRepository<User>{

   

    public void save() {

       System.out.println("Saved by UserRepository");

    }

 

}

 

UserService

@Service

public class UserService extends BaseService<User>{

 

}

 

[3]模型实体类

User

public class User {

 

}

 

[4]测试

ApplicationContext ioc = new ClassPathXmlApplicationContext("di.xml");

 

UserService us = (UserService) ioc.getBean("userService");

 

us.add();

 

执行结果

Saved by UserRepository

1、BaseService没有在ioc容器;

但BaseService是UserService基类,BaseService的属性UserService可以共享
2、Autowired并没有在其他Service组件的属性中,怎么就注入成功了?(属性继承)
3、怎么知道UserRepository .add()?

根据泛型注入的类型属性映射到UserRepository。

Spring

标签:运行时   books   service   成员变量   span   context   bsp   expected   引用   

原文地址:http://www.cnblogs.com/limingxian537423/p/7255418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!