my-spring-learing(IOC-bean)

spring 是 IOC 和AOP容器框架

1) Spring的优良特性

 ①  非侵入式:基于Spring开发的应用中的对象可以不依赖于SpringAPI   也就是轻量级的意思

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

 ③  面向切面编程Aspect Oriented Programming——AOP

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

 ⑤  组件化Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XMLJava注解组合这些对象。

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

 xml

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

    <bean id="helloWorld" class="first.wtd">
        <property name="name" value="Spring????"></property>
    </bean>
</beans>

 初使用IOC容器

IOC是一种想法,DI就是现实的操作。
IOC:A需要B,我通过容器直接把B放进去A,不需要敲命令行无实现放进去。

在class中声明的类中必须有无参数的构造器,也就是wtd(){}  这个必须有。 

这里的<property name="name">   中的名字必须是小写,必须有相对应的set get方法对应。

//创建IOC容器对象,这个对象可以取值配置好的bean里面的东西,id对应的那些class中的类
        //ClassPathXmlApplicationContext   找到xml文件创建IOC对象。
        //WebApplicationContext  专门用于web工程下的。
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //获取具体的对象
        //wtd w = (wtd) context.getBean("helloWorld");  <------方法一
        wtd w = context.getBean("helloWorld",wtd.class);   ///<------方法二
        //调用方法
        w.say();

配置 bean

 配置文件 

<!--
方法一:DI注入的第一种方法:set方法注入
-->
<bean id="car1" class="di.car">
<property name="name" value="宝马"></property>
<property name="price" value="123.23"></property>
<property name="id" value="ZX071zs"></property>
</bean>

<!--
方法二:构造器方式
对应参数顺序赋值
    参数: index是放在哪个位置 type是按照哪种类型存储

-->
<bean id="car2" class="di.car">
<constructor-arg value="奥迪"></constructor-arg>
<constructor-arg value="ZX071zs"></constructor-arg>
<constructor-arg value="123.23"></constructor-arg>
</bean>
<bean id="car3" class="di.car">
<constructor-arg value="奥迪" index="0"></constructor-arg>
<constructor-arg value="123.23" index="2"></constructor-arg>
<constructor-arg value="ZX071zs" index="1"></constructor-arg>
</bean>
<!--
当2000又可以赋值到int上面,又可以赋值到double,
<constructor-arg value="123.23" index="2" type="java.lang.Double"></constructor-arg>
-->

 方法三 p 命名空间

xmlns:p="http://www.springframework.org/schema/p"    需要在上面插入这句话

  <!--
        使用p命名空间给bean赋值
    -->
    <bean id="car4" class="di.car" p:id="ZX071zs" p:name="奥迪" p:price="123.23">  可以减少<constructor-arg>和<property>标签的使用 

当赋值为任意字符有问题时候:  <![CDATA[      这里写任意字符          ]]>

此时的赋值语句发生变化:

     <property name="name" >
            <value><![CDATA[ 宝马!!!!]]></value>
        </property>
<!-- 当赋值为一个类对象时候-->
<bean id="ren" class="di.ren">
    <property name="name" >
        <value><![CDATA[ wtd]]></value>
    </property>
    <property name="ca" ref="car1"></property>
</bean>
<!-- 内部bean  当此时内部没有该name的bean时候就可以用-->
    <bean id="ren2" class="di.ren">
        <property name="name" value="wtd"></property>
        <property name="ca" >
            <bean class="di.car">   内部beaen只有当前才可以读取得到,所以不用id都可以                           
                <property name="name" value="宝马"></property>
            </bean>
        </property>
    </bean>
<!-- 当赋值为一个类对象时候,但是此时该对象赋值不全-->
此时称为级联,一个对象对它进行的改动,其他的对象ref的时候看到的是改动后的对象。 <bean id="ren" class="di.ren"> <property name="name" value="wtd"></property> <property name="ca" ref="car1"></property>
   <property name="ca.id" value="1001"></property>
</bean>
<!-- 赋值空值 -->

<property name="ca.name">

  <null></null>

</property>
<!-- list集合 -->
    <bean id="show1" class="di.show">
        <property name="name" value="wtd"></property>
        <property name="lis">
            <!-- 构造一个集合-->
            <list>
                <ref bean="car1"></ref>
                <ref bean="car2"></ref>
                <ref bean="car3"></ref>
                <bean class="di.car">
                    <property name="name" value="桑塔纳"></property>
                </bean>
            </list>
        </property>
    </bean>
此时对象中存放的是List[car];当原来的对象存放的是 car[];时候也可以用list标签
同理,set对象也可以用<set>标签。
这里的list只能内部使用

util标签用于list,此时的list可以被外部引用  
  <util:list id="list1"> <ref bean="car1"></ref> <ref bean="car2"></ref> </util:list>   <bean id="show2" class="di.show"> <property name="name" value="wtd"></property> <property name="lis" ref="list1"> </property>    </bean>

 

 此时的map引用的是value-ref,value值指向ref引用的一个bean对象

FactoryBean就是返回一个getobject方法返回对象。
BeanFactory和FactoryBean的区别:BeanFactory就是IOC容器的基本实现,是spring的基础设施,FactoryBean是一个接口

class

 

 

此时的id,abstract 都不能被继承

Bean中的依赖关系,如果依赖多个bean文件,用逗号隔开。

baen的作用域

如果想关闭IOC容器,用这样子的声明方式。
ConfigurableApplicationContext conn = new ClassPathXmlApplicationContext("spring-di.xml"); conn.close();

 bean的生命周期

bean配置连接数据库池子

这里导入了mysql包和c3p0包

 

 

到此,通过xml文件配置bean结束。

通过注解方式配置文件

 类加注解

由于接口不能声明对象,注解只能加在实现类上面。

 xml文件中扫描

这是包的路径

xml具体配置。

 

此时的使用 

自动赋值,看下面。

自动装配样例

 

 这里的注解都加在对象头上面。

 

原文地址:https://www.cnblogs.com/0123wtdd/p/12266399.html