Spring初级(Spring IOC)

Spring IOC

导入依赖

在这里插入图片描述

使用配置文件的方式

创建Bean

使用配置文件的Java类
public class AccountServiceImpl implements IAccountService {   
 	private IAccountDao accountDao; 
 
 	public void setAccountDao(IAccountDao accountDao) {  
  	this.accountDao = accountDao; 
  	}
 } 
bean.xml配置文件

创建Bean对象的3种方式
在这里插入图片描述

依赖注入(bean.xml)

构造函数注入
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd"> 
<!-- 使用构造函数的方式,给 service 中的属性传值
  要求:
    类中需要提供一个对应参数列表的构造函数。
  涉及的标签:
     constructor-arg
     属性:
        index:指定参数在构造函数参数列表的索引位置
        type:指定参数在构造函数中的数据类型
		name:指定参数在构造函数中的名称     用这个找给谁赋值 
		=======上面三个都是找给谁赋值,下面两个指的是赋什么值的============== 
        value:它能赋的值是基本数据类型和 String 类型
        ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean 
 --> 
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> 
 		<constructor-arg name="name" value=" 张三 "></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg> 
 		<constructor-arg name="birthday" ref="now"></constructor-arg>
    </bean> 
    <bean id="now" class="java.util.Date"></bean>
</beans> 
set 方法注入 (常用)
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd"> 
<!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式 
	涉及的标签: 
		property
		属性:
 			name:找的是类中 set 方法后面的部分
			ref:给属性赋值是其他 bean 类型的
    		value:给属性赋值是基本数据类型和 string 类型的 
-->	
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">   			<property name="name" value="test"></property> 
  		<property name="age" value="21"></property>
        <property name="birthday" ref="now"></property> 
	</bean>
    <bean id="now" class="java.util.Date"></bean>
</beans> 
注入集合属性
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注入集合数据
   	List 结构的:
   		array,list,set 
 	Map 结构的
   		map,entry,props,prop 
--> 
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> 
 		<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
        <!-- 给数组注入数据 -->
        <property name="myStrs"> 
  			<set>
                <value>AAA</value>
             	<value>BBB</value>
                <value>CCC</value>
            </set> 
 		</property> 
 		<!-- 注入 list 集合数据 -->
        <property name="myList">
            <array>
                <value>AAA</value>
                <value>BBB</value>
                <value>CCC</value>
            </array>
        </property> 
 		<!-- 注入 set 集合数据 -->
        <property name="mySet"> 
  			<list>
                <value>AAA</value>
                <value>BBB</value>
                <value>CCC</value>
            </list>
        </property> 
 		<!-- 注入 Map 数据 -->
        <property name="myMap">
            <props> 
   				<prop key="testA">aaa</prop>
                <prop key="testB">bbb</prop>
            </props> 
 		</property> 
 	</bean> 
</beans>

改变作用范围

scope取值

​ singleton 单例,即创建一次对象

​ prototype 多例,即创建多个对象

生命周期

​ 初始化执行的方法 销毁执行的方法

使用注解的方式

创建Bean

使用注解的Java类
/*参数作用:指定对象在核心容器中id,如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写
这三个注解跟@Component作用和属性都一样
	@Controller:一般用于表现层的注解。 
    @Service:一般用于业务层的注解。 
    @Repository:一般用于持久层的注解。*/ 
@Component("accountService") 
public class AccountServiceImpl implements IAccountService {   
 	private IAccountDao accountDao; 
 
 	public void setAccountDao(IAccountDao accountDao) {  
  	this.accountDao = accountDao; 
  	}
 } 
bean.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
	xmlns:context="http://www.springframework.org/schema/context" 
    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 
        http://www.springframework.org/schema/context      
        http://www.springframework.org/schema/context/spring-context.xsd"> 
     
 <!-- 告知 spring 创建容器时要扫描的包 --> 
 <context:component-scan base-package="com.itheima"></context:component-scan>
 </beans> 

依赖注入(bean.xml)

@Autowired

在这里插入图片描述

@Qualifier

在这里插入图片描述

@Resource

在这里插入图片描述

@Value

在这里插入图片描述

改变作用范围

@Scope 属性:value:

​ singleton 单例

​ prototype 多例

生命周期

@PostConstruct 用于指定初始化方法

@PreDestroy 用于指定销毁方法。

获取核心容器中的对象

//1.获取核心容器对象
 ApplicationContext ac = new ClassPathXmlApplcationContext("bean.xml");
//2.根据id获取bean对象
//IAccountService as = (IAccountService)ac.getBean(accountService);
//利用类型返回IOC容器的bean,但要求IOC容器中,必须只能有一个该类型的bean
IAccountService as = ac.getBean("accountService",accountService.class);

使用Java类代替bean.xml(全注解方式)

jdbcConfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy
jdbc.username=root
jdbc.password=1234
SpringConfiguration.java
package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

/**
 * 该类是一个配置类,它的作用和bean.xml是一样的
 * spring中的新注解
 * Configuration
 *     作用:指定当前类是一个配置类
 *     细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
 * ComponentScan
 *      作用:用于通过注解指定spring在创建容器时要扫描的包
 *      属性:
 *          value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
 *                 我们使用此注解就等同于在xml中配置了:
 *       	<context:component-scan base-package="com.itheima"></context:component-scan>
 *  Bean
 *      作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
 *      属性:
 *          name:用于指定bean的id。当不写时,默认值是当前方法的名称
 *      细节:
 *          当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
 *          查找的方式和Autowired注解的作用是一样的
 *  Import
 *      作用:用于导入其他的配置类
 *      属性:
 *          value:用于指定其他配置类的字节码。
 *                  当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
 *  PropertySource
 *      作用:用于指定properties文件的位置
 *      属性:
 *          value:指定文件的名称和路径。
 *                  关键字:classpath,表示类路径下
 */
//@Configuration
@ComponentScan("com.itheima")
@Import(JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {


}
JdbcConfig.java
package config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;

import javax.sql.DataSource;

/**
 * 和spring连接数据库相关的配置类
 */
public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    /**
     * 用于创建一个QueryRunner对象
     * @param dataSource
     * @return
     */
    @Bean(name="runner")
    @Scope("prototype")
    //									   指定配置源
    public QueryRunner createQueryRunner(@Qualifier("ds2") DataSource dataSource){
        return new QueryRunner(dataSource);
    }

    /**
     * 创建数据源对象
     * @return
     */
    @Bean(name="ds2")
    public DataSource createDataSource(){
        try {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driver);
            ds.setJdbcUrl(url);
            ds.setUser(username);
            ds.setPassword(password);
            return ds;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    @Bean(name="ds1")
    public DataSource createDataSource1(){
        try {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driver);
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/eesy02");
            ds.setUser(username);
            ds.setPassword(password);
            return ds;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}
获取全注解方式的容器
//1.获取容器
ApplicationContext ac=new AnnotationConfigApplicationContext(SpringConfiguration.class);
//2.获取queryRunner对象
QueryRunner runner = ac.getBean("runner",QueryRunner.class);

Spring 整合 Junit

package com.itheima.test;

import com.itheima.domain.Account;
import com.itheima.service.IAccountService;
import config.SpringConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

/**
 * 使用Junit单元测试:测试我们的配置
 * Spring整合junit的配置
 *      1、导入spring整合junit的jar(坐标)
 *      2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
 *             @Runwith
 *      3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
 *          @ContextConfiguration
 *                  locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
 *                  classes:指定注解类所在地位置
 *		4、使用@Autowired到对象中
 *   当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {

    @Autowired
    private IAccountService as = null;


    @Test
    public void testFindAll() {
        //3.执行方法
        List<Account> accounts = as.findAllAccount();
        for(Account account : accounts){
            System.out.println(account);
        }
    }

    @Test
    public void testFindOne() {
        //3.执行方法
        Account account = as.findAccountById(1);
        System.out.println(account);
    }

    @Test
    public void testSave() {
        Account account = new Account();
        account.setName("test anno");
        account.setMoney(12345f);
        //3.执行方法
        as.saveAccount(account);

    }

    @Test
    public void testUpdate() {
        //3.执行方法
        Account account = as.findAccountById(4);
        account.setMoney(23456f);
        as.updateAccount(account);
    }

    @Test
    public void testDelete() {
        //3.执行方法
        as.deleteAccount(4);
    }
}

动态代理

基于接口的动态代理

在这里插入图片描述

基于子类的动态代理

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值