您的位置:首页 > 编程语言 > Java开发

spring简介和Ioc控制反转

2019-08-19 17:23 405 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43711904/article/details/99714841

1、spring简介

>理念:本身是大杂烩整合现有技术

>优点:轻量级()框架;Ioc容器-控制反转;Aop面向切面编程;支持事务;支持框架……

创建对象由容器实现,不再由应用程序实现;减小耦合性,(service与dao)层与层分离,并不直接依赖;如果dao层的实现发生改变,应用程序并不需改变。

2、Ioc编程思想

控制反转(依赖注入-需要有set方法):控制对象的创建,权限交由spring,程序变为被动接收对象。

3、Ioc的实现是通过Ioc容器来实现的,Ioc容器-BeanFactory

<?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-2.5.xsd">
    <bean id="mysqlDao" class="dao.impl.UserDaoMySqlImpl"/>
    <bean id="oracleDao" class="dao.impl.UserDaoOracleImpl"/>
    <bean id="service" class="service.impl.UserServiceImpl"/>
        <!--ref引用对象(对象由spring创建)-->
        <property name="userDao" ref="mysqlDao"></property>
    </bean>
</beans>

4、使用Ioc创建对象的3种方式

*通过无参构造方法来创建

<bean id="user" class="pojo.User">
    <property name="name" value="张三"></property>
</bean>

*通过有参构造创建

<bean id="user" class="pojo.User"/>
    <!--根据参数下标设置的-->
    <constructor-arg index="0" value="李四" />
    <!--根据参数名设置-->
    <constructor-arg name="name" value="李四" />
    <!--根据参数类型设置-->
    <constructor-arg type="java.lang.String" value="李四" />
</bean>

*通过工厂方法来创建对象

(静态工厂)创建工厂类:

public class UserFactory {
    public static User newInstance(String name) {
        return new User(name) ;
    }
}

配置:

<bean id="user" class="factory.UserFactory" factory-method="newInstance">
    <constructor-arg index="0" value="李四" />
</bean>

(动态工厂)

public class UserFactory {
    public User newInstance(String name) {
        return new User(name) ;
    }
}

<bean id="userFactory" class="factory.UserFactory" />
<bean id="user" class="uerFactory" factory-method="newInstance">
    <constructor-arg index="0" value="李四" />
</bean>

5、配置文件

<beans>

    <!--id是bean的标识符,要唯一,如果没有配置id,则name默认为标识符;
        如果不设置id和name,那么可以根据applicationContext.getBean(class)获取对象
    -->
    <!--alias给指定bean设置别名(多个)-->
    <alias name="user" alias="user1" />
    <!--团队协作通过import来实现-->
    <import resource="entity.xml" />
</beans>

6、依赖注入DI:指bean对象创建依赖于容器,依赖的资源由容器来设置和装配。

spring注入:

构造器注入:

【重要】setter注入:要求被注入的属性必须有set方法。set方法的方法名由set+属性首字母大写。如果属性是boolean没有get方法是is方法。

<bean id="user" class="pojo.User">
    <!--常量注入-->
    <property name="name" value="张三"></property>
    <!--Bean注入-->
     <property name="userDao" ref="mysqlDao"></property>
    <!--数组注入-->
     <property name="books">
        <array>
            <value>A</value>
            <value>B</value>
        </array>
    </property>
    <!--List集合注入--><!--和set格式差不多-->
    <property name="hobbies">
        <list>
            <value>A</value>
            <value>B</value>
        </list>
    </property>
    <!--Map集合注入-->
    <property name="cards">
        <map>
            <entry key="银行" value="1111111" />
            <entry>
                <key>银行</key>
                <value>111111</value>
            </entry>
        </map>
    </property>
    <!--空注入-->
    <property name="wife"><null /></property>
    <!--propertise注入-->
    <property name="info">
        <props>
            <prop key="学号">1111</prop>
            <prop key="姓名">张三</prop>
        </props>
    </property>    
</bean>


<!--要先在beans元素(头文件)中添加属性:xmlns:p="http://www.springframework.org/schema/p"-->
<!--p命名空间注入-->
<bean id="user" class="pojo.User" p:name="风清扬" p:age="18" />

<!--c命名空间注入,增加头文件:xmlns:c="http://www.springframework.org/schema/c"-->
<!--c命名空间注入,与其他注入不同点在于其需要有对应参数的构造方法(而不是set方法)-->
<bean id="user" class="pojo.User" c:name="风清扬" c:age="18" />

7、bean的作用域(bean属性:scope="")

singleton单例(默认作用域):整个容器中只有一个对象实例

prototype原型:每次获取bean都产生一个新的对象

request:每次请求时创建一个新的对象

session:在会话范围内时是一个对象

global session:只在portlet下有用,表示的是application

application:表示在一个应用范围内是一个对象

8、bean的自动装配

设置bean的autowire属性:默认autowire="no"

>autowire="byName"根据名称装配,名称是在service类中定义的设置Dao层对象的set方法名称(去掉set)

public void setUserDao(UserDao userDao) {
    this.userDao = userDao ;
}

>autowire="byType"根据类型自动装配,不用管bean的id,但是同一种类型的bean只能有一个,否则会报错

public void setUserDao(UserDao userDao) {
    this.userDao = userDao ;
}

>autowire="constructor"当通过构造器注入实例化bean时,使用byType的方式装配构造方法

public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao ;
}

可以配置全局的自动装配类型,在bean.xml文件的头部添加default-autowire="byName"

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: