Spring(二、Spring IOC)

一、Spring的IOC操作

1、把对象的创建交给spring进行管理
2、ioc的操作有两部分操作:
    (1)ioc里基于配置文件的方式实现
    (2)ioc里基于注解的方式实现
3、ioc的底层原理里主要使用的技术
    (1)xml配置文件
    (2)dom4j解析xml
    (3)工厂设计模式
    (4)反射

二、IOC操作(基于XML)

案例:

1、普通的方法调用过程

package com.test;
public class User {
    public void hello() {
        System.out.println("hello...");
    }

    public static void main(String[] args) {
        //原始调用方法
        User user = new User();
        user.hello();
    }
}

2、使用SpringIOC 调用方法的过程

1、创建项目,导入Spring基本的jar包和commons-logging.jar包
注意:需要同时导入commons-logging.jar包,否则会报错

这里写图片描述

2、创建spring的配置文件并配置创建的类

(1)spring核心配置文件的名称和位置不是固定的。可以创建多个配置文件。
    建议放到src目录下(方便获取),名称没有要求。官方建议名称applicationContext,xml
(2)在配置xml文件里,引入schema约束。

配置文件:

<?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="user" class="com.test.User"></bean>


3、调用:

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User bean = (User) context.getBean("user");
bean.hello();

四、bena标签的常用属性

id    :起名称,id属性值名称无要求,可任意命名,用来在项目中查找此bean对象。
           --id属性值:不能写中文,不能包含特殊的符号。
class :创建对象类的全路径。
name  :功能和id值一样,id属性值不能包含特殊符号,name中可以包含特殊符号。为了兼容旧版(已弃用)
scope :表示创建的对象的特点。
       singleton:默认的,对象是单例。
       prototype:多例的。

request:web项目中,Spring创建一个bean对象,将对象存入到request域中。
session:web项目中,Spring创建一个bean对象,将对象存入到session域中。
globalSession:web项目中,应用在prolet环境,如果没有prolet环境,那么globalSession相当于session。

五、属性注入介绍

属性注入:在创建对象的时候,对对象的属性设置值。

java代码中,属性注入的方式:
(1)有参构的造方式
(2)使用set方式注入
(3)使用接口注入

Spring框架中,只支持set方法注入和有参数的构造注入。

1、使用有参构造注入属性

package com.test;

public class Bean1 {
    private String userName;

    public Bean1(String userName) {
        super();
        this.userName = userName;
    }

    public void output() {
        System.out.println("userName: " +userName);
    }
}

配置文件配置参数注入:

<!--使用有参构造注
入属性  -->
<bean id="bean1" class="com.test.Bean1">
    <!--name:属性名    value:属性值  -->
    <constructor-arg name="userName" value="spring"></constructor-arg>
</bean>

2、使用set方法注入属性(常用)

package com.test;

public class Bean2 {
    private String userName;

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public void output() {
        System.out.println("userName: " +userName);
    }
}

配置文件配置参数注入:

<!--使用set方法注入属性  -->
<bean id="bean2" class="com.test.Bean2">
    <!--name:类里面定义的属性名  value:设置的属性值  -->
    <property name="userName" value="spring"></property>
</bean>

3、注入对象类型属性(重点)
1、创建service类和dao类。
(1)在service中得到dao的对象。
1、在service里,把dao作为一个属性。
2、生成dao的set方法。

package com.test;

public class Dao {
    public void output() {
        System.out.println("dao output....");
    }
}
package com.test;

public class Service {
    private Dao userDao;


    public Dao getUserDao() {
        return userDao;
    }

    //创建set方法,通过set方法注入值。
    public void setUserDao(Dao userDao) {
        this.userDao = userDao;
    }


    public void output() {
        userDao.output();
        System.out.println("service output....");
    }
}
<!--配置service 和dao对象  -->
<bean id="dao" class="com.test.Dao"></bean>
<bean id="service" class="com.test.Service">
    <!-- ref:引用,要注入哪一个对象,写bean标签的id值 -->
    <property name="userDao" ref="dao"></property>
</bean>
//调用输出
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Service bean = (Service) context.getBean("service");
bean.output();

输出结果:
这里写图片描述

六、注入复杂类型属性

package com.test;

import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.junit.Test;

public class Bean3 {
    private String[] arrs;
    private List<String> list;
    private Map<String, String> map;
    private Properties properties;

    public String[] getArrs() {
        return arrs;
    }
    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    public Properties getProperties() {
        return properties;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Test
    public void output (){
        System.out.println("arrs: " +arrs);
        System.out.println("list: " +list);
        System.out.println("map: " +map);
        System.out.println("properties: " +properties);
    }

}

配置文件配置属性值:

<bean id="bean3" class="com.test.Bean3">
    <!--数组  -->
    <property name="arrs">
        <list>
        <value>wanna</value>
        <value>luna</value>
        <value>chen</value>
        <value>shiki</value>
        </list>
    </property>

    <!--list -->
    <property name="list">
        <list>
            <value>guangzhou</value>
            <value>shenzhen</value>
            <value>zhongshan</value>
        </list>
    </property>

    <!--map -->
    <property name="map">
        <map>
        <entry key="aa" value="AA"></entry>
        <entry key="bb" value="BB"></entry>
        <entry key="cc" value="CC"></entry>
        </map>
    </property>

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

调用输出:

//调用输出
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Bean3 bean = (Bean3) context.getBean("bean3");
bean.output();

输出结果:
这里写图片描述

七、IOC操作(注解)

1、注解介绍
注解:代码里面的特殊标记,使用注解可以直接完成相关功能。
注解的写法:@注解名称(属性名称=属性值)。如果只有一个属性,则可以省略属性名称 :@注解名称(属性值)
注解使用范围:可以使用在类方面,方法上面,属性上面。

Spring的bean管理(注解)
(1)使用注解创建对象
(2)使用注解注入属性
(3)xml和注解方式混合使用

2、注解创建对象
(1)导入Spring基本jar包和aop包
这里写图片描述
(2)引入注解相关约束

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd"

(3)xml配置,开启注解扫描

<!--开启注解扫描,到包里面扫描类、方法、属性上是否有注解
    base-package:扫描的类所在的包名,多个包名之间用逗号隔开
    如果有com.test.test1,com.test.test2两个包,则用com.test作为base-package的值也可以
  -->
<context:component-scan base-package="com.test"></context:component-scan>

<!--只扫描属性上的注解  -->
<context:annotation-config></context:annotation-config>

(4)注解创建对象

package com.test;

import org.springframework.stereotype.Component;

@Component(value="bean4") //等同于 <bean id="bean4" class="com.test.Bean4"> </bean>
public class Bean4 {

    public void output() {
        System.out.println("bean4 output....");
    }
}

(5)输出

//调用输出
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Bean4 bean = (Bean4) context.getBean("bean4");
bean.output();

创建对象有四个注解:
Spring中提供@component的三个衍生注解:(功能目前来讲是一致的,都创建对象)

@Controller :web层
@Service    :业务层
@Repository :持久层

这三个注解是为了让标注类本身的用途清晰

创建对象是单实例还是多实例(scope注解):

@Component(value="bean4") //等同于 <bean id="bean4" class="com.test.Bean4"> </bean>
@Scope(value="prototype") //prototype:多例的 不填写默认为singleton:单例
public class Bean4 {

    public void output() {
        System.out.println("bean4 output....");
    }
}

3、注解注入属性
注入属性:@Autowired、@Resource(name=”“),这两种方式都可以实现注入属性。使用resource需要指定name值,name值为UserDao的注解的value值。
Bean4.java

package com.test;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component(value="bean4") //等同于 <bean id="bean4" class="com.test.Bean4"> </bean>
@Scope(value="prototype") //prototype:多例的 不填写默认为singleton:单例
public class Bean4 {

    public void output() {
        System.out.println("bean4 output....");
    }
}

Bean5.java

package com.test;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller("bean5")
public class Bean5 {

//  @Autowired
    @Resource(name="bean4")
    private Bean4 bean4;

    public void output () {
        bean4.output();
        System.out.println("bean5 output...");
    }

}

调用:

//调用输出
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Bean5 bean = (Bean5) context.getBean("bean5");
bean.output();

输出结果:
这里写图片描述

4、注解和配置文件混合使用

1、创建对象操作使用配置文件方式实现。
2、注入属性的操作使用注解的方式实现。

Bean4.java

public class Bean4 {
    public void output() {
        System.out.println("bean4 output....");
    }
}

Bean5.java

public class Bean5 {

//  @Autowired
    @Resource(name="bean4")
    private Bean4 bean4;

    public void output () {
        bean4.output();
        System.out.println("bean5 output...");
    }

}

配置文件:

    <bean id="bean4" class="com.test.Bean4"></bean>
    <bean id="bean5" class="com.test.Bean5"></bean>

调用:

//调用输出
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Bean5 bean = (Bean5) context.getBean("bean5");
bean.output();

输出结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值