zoukankan      html  css  js  c++  java
  • IOC容器和Bean的配置实例

    实验1:

    <!--实验1:通过IOC容器创建对象,并为属性赋值 -->
    <!-- 需要由IOC容器创建对象的全类名 -->
    <!-- 为了便于从IOC容器中获取book对象,声明一个一个唯一的id值 -->
    <bean id="book01" class="com.neuedu.spring.bean.Book">
    <property name="bookId" value="2001"></property>
    <property name="bookName" value="三国演义"></property>
    <property name="author" value="罗贯中"></property>
    <property name="price" value="22.5"></property>
    </bean>


    @Test
    public void test01() {
    //1.创建IOC容器自身的对象
    //指定配置文件以类路径为基准的配置文件名
    ApplicationContext ioc= new ClassPathXmlApplicationContext("bean.xml");
    //2.从IOC容器中获取指定的对象
    Object bean = ioc.getBean("book01");
    System.out.println(bean);
    }


    注意:
    ①IOC容器本身对象创建时,会将配置文件中配置好的bean先创建出来
    ②默认是单实例的,只创建bean的一个对象
    ③如果设置bean的scope属性为prototype,那么创建bean的对象就是多实例的,在获取的时候创建,每次获取对象都会创建新的
    ④.从IOC容器中获取对象
    ①根据bean的id获取
    ②根据bean的类型获取:要求容器中指定类型的bean是唯一的

      

    实验15:配置通过静态工厂方法创建的bean[通过静态方法提供实例对象,工厂类本身不需要实例化!]
    <bean id="staticFactory" class="com.neuedu.spring.bean.StaticFactory" factory-method="getBook">
    <constructor-arg value="book01"></constructor-arg>
    </bean>

    实验16:配置通过实例工厂方法创建的bean[通过实例方法提供实例对象,工厂类本身需要先创建对象!]
    <bean id="instanceFactory" class="com.neuedu.spring.bean.InstanceFactory"></bean>
    <bean id="bookFromInstanceFactory" factory-bean="instanceFactory" factory-method="getBook">
    <constructor-arg value="book02"></constructor-arg>
    </bean>

    实验17:配置FactoryBean★
    public class MyFactoryBean implements FactoryBean<Book> {

    @Override
    public Book getObject() throws Exception {
    return new Book(22, "无字天书", "好啊", 22.5);
    }

    @Override
    public Class<?> getObjectType() {
    return Book.class;
    }

    @Override
    public boolean isSingleton() {
    return false;
    }

    }

    实验22[补充]:测试bean的后置处理器
    ①在bean的初始化方法调用前后执行操作的专门的对象
    ②自定义后置处理器实现该接口:org.springframework.beans.factory.config.BeanPostProcessor
    ③在springmvc中配置一下该bean对象.
    <bean class="com.neuedu.spring.bean.Book" init-method="init"></bean>
    <bean id="myBeanPostProcessor" class="com.neuedu.spring.bean.MyBeanPostProcessor"></bean>


    数据库连接池:
    6) 数据库连接池
    > 数据库连接池就是存放数据库连接(Connection)的集合
    > 我们获取一个数据库连接是一个相对很麻烦的过程,
    如果我们获取一个数据库连接,使用一次以后就给它关闭了
    下一次再去使用的时候就要重新创建一个新的数据库连接。
    > 所以我们提出了一个数据库连接池的概念,数据库连接池放的都是数据库连接(Connection)
    我们在去使用数据库连接时候,不用再去重新创建数据库连接,而是直接从池中获取,
    使用完的数据库连接,也不是直接销毁,而是要放回到连接池。
    > 数据库连接池的常见的属性:

    ? 初始连接数量:数据连接池创建以后,保存数据库连接的数量

    ? 最小空闲连接数:数据库连接池最少得未使用的数据库连接的数量

    最大空闲连接数:数据库连接池最大闲置连接数,当闲置连接数满了以后,将不会有其他连接进入池

    ? 每次增加连接数:当数据库连接都被占用以后,一次性增加的数据库连接的个数

    ? 最大连接数:数据库连接池的最大容量,当最大连接数饱和了,则不再创建新的数据库连接

    ? 最大等待时间:当数据库连接池饱和以后,等待获取数据库连接的时间

    > 常见的数据库连接池
    - 所有的数据库连接池都需要实现DataSource,当使用数据库连接池是,我们便不再需要使用DriverManger获取数据库连接
    而是使用DataSource。
    - Connection getConnection()
    - 从数据库连接池中获取数据库连接对象

    1.DBCP
    - DBCP是Apache出品的一款数据库连接
    - DBCP依赖于commons-pool
    - 使用DBCP需要导入两个jar包:
    commons-dbcp-1.4.jar
    commons-pool-1.5.5.jar
    - 当我们通过数据库连接池获取数据库连接以后,我们所获取到数据库连接已经不是我们熟悉的那个Connection
    数据库连接池对Connection对象进行了包装,它修改Connection的close()方法,
    再去调用close()数据库连接将不会真的关闭,而是要放回到数据库连接池中,供其他线程使用。
    - 核心类:
    BasicDataSourceFactory

    2.C3P0(重点)
    - C3P0使用的是XML作为配置文件
    - 使用c3p0需要导入一个jar包:
    c3p0-0.9.1.2.jar
    - 导入c3p0的配置文件:
    1.配置文件的名字:c3p0-cofig.xml
    2.配置文件要求放到类路径下(src)
    - 核心类:
    ComboPooledDataSource
    - 注意:
    DataSource就相当于池子,我们的数据库连接都是从DataSource中获取的,
    如果程序中有多个DataSource的实例,那么我们说你还不如不用数据库连接池。
    所以我们的DataSource在项目中应该只有一个实例。

    实验23:引用外部属性文件★
    jdbc.properties文件:
    jdbc.user=root
    jdbc.passowrd=123456
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.driver=com.mysql.jdbc.Driver

    <context:property-placeholder location="classpath:jdbc.properties"/>
    1.在目标属性上加@Value注解
    @Value("${jdbc.user}")
    private String username;
    2.
    <!-- 根据外部属性文件中的信息配置数据源 -->
    <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="${jdbc.user}"></property>
    <property name="password" value="${jdbc.passowrd}"></property>
    <property name="jdbcUrl" value="${jdbc.url}"></property>
    <property name="driverClass" value="${jdbc.driver}"></property>
    </bean>


    ComboPooledDataSource bean = ioc.getBean(ComboPooledDataSource.class);
    Connection connection = bean.getConnection();
    System.out.println(connection);
    Statement st = connection.createStatement();
    ResultSet rs = st.executeQuery("select * from stu");
    while(rs.next()){
    String string = rs.getString("name");
    String string2 = rs.getString("school");
    System.out.println(string+"==="+string2);
    }

    实验24:基于XML的属性装配
    ①手动装配
    <!-- 属性的装配:手动装配 -->
    <bean id="userService" class="com.neuedu.spring.bean.UserService"></bean>
    <bean id="userAction" class="com.neuedu.spring.bean.UserAction">
    <property name="userService" ref="userService"></property>
    </bean>

    ②自动装配
    <!-- 1.按类型装配:byType -->
    <!-- 首先检测当前bean中需要装配的属性的类型 -->
    <!-- 然后在IOC容器中查找匹配这个类型的bean -->
    <!-- 如果类型匹配的bean是唯一的,那么就将这个匹配的bean注入到userAction中 -->

    <bean id="userService" class="com.neuedu.spring.bean.UserService"></bean>
    <bean id="userAction" autowire="byType" class="com.neuedu.spring.bean.UserAction"></bean>

    <!-- 2.按bean的id值装配:byName -->
    <!-- 首先检测当前bean中需要装配的属性的属性名,属性名是将setXxx()方法去掉set,首字母小写得到的 -->
    <!-- 然后根据属性名作为id的值,在IOC容器中查找对应的bean -->
    <!-- 如果能够找到,则将找到bean注入进去 -->



    6。SpEL简介【见WORLD文档---了解】
    Spring Expression Language,Spring表达式语言,简称SpEL。支持运行时查询并可以操作对象图。
    和JSP页面上的EL表达式、Struts2中用到的OGNL表达式一样,SpEL根据JavaBean风格的getXxx()、setXxx()方法定义的属性访问对象图,完全符合我们熟悉的操作习惯。

    6.1 基本语法
    SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL表达式。

    6.2 使用字面量
    ●整数:<property name="count" value="#{5}"/>
    ●小数:<property name="frequency" value="#{89.7}"/>
    ●科学计数法:<property name="capacity" value="#{1e4}"/>
    ●String类型的字面量可以使用单引号或者双引号作为字符串的定界符号
    <property name=“name” value="#{'Chuck'}"/>
    <property name='name' value='#{"Chuck"}'/>
    ●Boolean:<property name="enabled" value="#{false}"/>

    8.使用注解配置bean
    ①声明bean的注解
    @Component 将当前类声明为IOC容器中的一个普通的组件
    @Controller 将当前类声明为IOC容器中的一个控制器组件
    @Service 将当前类声明为IOC容器中的业务逻辑层组件
    @Repository 将当前类声明为IOC容器中的一个持久化层组件
    Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。

    ②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar
    ③需要设置自动扫描的包
    < context:component-scan base-package ="com.neuedu.ioc.bean"/>


    ④使用注解后,默认按照类名首字母小写作为id的值,也可以使用value属性指定id,value属性名也可以省略注解
    注解 id值

    @Component commonComponent
    public class CommonComponent {
    }

    @Controller(value="neueduBookAction" ) neueduBookAction
    public class BookAction {

    }

    @Service("happyService" ) happyService
    public class BookService {

    }

    实验33:使用context:exclude-filter指定扫描包时不包含的类

    < context:component-scan base-package ="com.neuedu.ioc.bean"/>
    [1]base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。
    [2]当需要扫描多个包时可以使用逗号分隔,
    [3]如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:
    <context:component-scan base-package="com.neuedu.component" resource-pattern="autowire/*.class"/>
    [4]包含与排除
    ●<context:include-filter>子节点表示要包含的目标类
    注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。
    即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则
    指定的组件了。
    ●<context:exclude-filter>子节点表示要排除在外的目标类
    ●component-scan下可以拥有若干个include-filter和exclude-filter子节



    ⑤使用注解进行自动装配:@Autowired注解[好处就是:连get、set方法都不用写!]
    [1]首先检测标记了@Autowired注解的属性的类型
    [2]根据类型进行装配
    [3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean
    [4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id.

  • 相关阅读:
    Java_大数加法
    Java_找出最多的10个单词
    过滤文本敏感词
    JDK(Win10)下载与安装
    Agile PLM_统计物料消耗
    Java_扑克牌顺子
    Java8_stream_集合对象属性的合并
    Apache Maven下载与安装
    java泛型 无敌
    Java异常处理 无敌
  • 原文地址:https://www.cnblogs.com/lc-java/p/7445441.html
Copyright © 2011-2022 走看看