Spring学习第二天,注解的使用和(注解注入/XML和注解注入/XML注入)

spring第二天总结

xml配置需要注意的点

1、配置QueryRunner对象
set方法注入,给QueryRunner生成set方法,通过xml配置QueryRunner进行注入

<!--配置QueryRunner对象-->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
        <!--构造方法,注入数据源-->
        <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>

2、注入QueryRunner时,数据源也可以实施配置,并且可以注入连接数据库的信息

<!-- 配置dao对象 -->
    <bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
        <!-- 注入QueryRunner -->
        <property name="runner" ref="runner"></property>
    </bean>

    <!-- 配置QueryRunner对象 -->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
        <!-- 注入数据源 -->
        <constructor-arg name="ds" ref="dataSource"> </constructor-arg>
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 连接数据库的必备信息 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

3、QueryRunner是单例对象时,面临多个Dao调用产生的线程安全问题。
修改作用域为prototype(多例的)

@注解注入的解释
1、用于创建对象的有:Component和Controller、Service、Repository
		Component:将当前类存入spring容器中(多用于其他类)
		Controller: 将当前类存入spring容器中(一般用于表现层)
		Service: 将当前类存入spring容器中(一般用于业务层) 
		Repository: 将当前类存入spring容器中(一般用于持久层)
		注释:以上三个注解他们的作用和属性Component是一模一样的。
			它们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰。
2、用于注入数据的:Autowired、Qualifier、Resource、Value
		Autowired:
			作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
                  如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
                  如果ioc容器中有多个类型匹配时,需要通过Qualifier标明是哪儿个类型。
			出现位置:
				可以是变量上,也可以是方法上。
			细节:
				在使用注解注入时,set方法就不是必须的了。
		Qualifier:
			作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。
				  但是在给方法参数注入时,可以选择同类型参数的其中一个。例:Qualifier("ds1")
		Resource:
			作用:直接按照bean类的id注入。它可以独立使用
			属性:
				name:用于指定bean类的id
		注意:以上三个注入的都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。另外,集合类型的注入只能通过XML实现
		Value:
			作用:用于注入基本类型和String类型的数据
			属性:
				value: 用于指定数据的值。它可以使用spring中的SpEL(也就是spring的EL表达式)
					   SpEL的写法:${表达式}
			注意:纯注解配置中有使用Value来对成员变量赋上配置文件的值
3、用于改变作用域范围的:
		他们的作用就和在bean标签中使用scope属性实现的功能是一样的
		Scope:
			作用:用于指定bean的作用范围
			属性:
				value:指定范围的取值。常用取值:singleton、prototype
4、和生命周期相关的 (了解即可)
        他们的作用就和在bean标签中使用init-method和destroy-method的作用是一样的
        PreDestroy
            作用:用于指定销毁方法
        PostConstruct
            作用:用于指定初始化方法
spring中的新注解
	@Configuration
      		作用:指定当前类是一个配置类
     		细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
	@ComponentScan
      		作用:用于通过注释指定spring在创建容器时要扫描的包
      		属性:
          		value:它和basePackage的作用是一样的,都是用于指定创建容器时要扫描的包。
                 		我们使用此注解就等同于在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,表示类路径下		
实战开发中的三种配置注入方式:
1、纯xml配置

XML代码

	<!-- 配置Service对象 -->
	<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
		<!-- 注入dao对象 -->
		<property name="accountDao" ref="accountDao"></property>
	</bean>
	
	<!--配置dao对象-->
	<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
		<!--注入QueryRunner对象-->
		<property name="runner" ref="runner"></property>
	</bean>
	
	<!--配置QueryRunner对象-->
	<bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
		<!--构造方法,注入数据源-->
		<constructor-arg name="ds" ref="dataSource"></constructor-arg>
	</bean>
	
	<!--配置数据源-->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!--连接数据库的必备信息-->
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy"></property>
		<property name="user" value="root"></property>
		<property name="password" value="root"></property>
	</bean>

Java代码

	public class AccountServiceImpl implements IAccountService {
		private IAccountDao accountDao;
		public void setAccountDao(IAccountDao accountDao){
			this.accountDao = accountDao;
		}
	}
	public class AccountDaoImpl implements IAccountDao {
		private QueryRunner runner;
		public void setRunner(QueryRunner runner) {
			this.runner = runner;
		}
	}

思考时注意:使用XML配置时,通常是set方式注入和有参构造方式注入;set方式要给每个需要配置的变量都添加set方法

2、xml与注解同时配置

XML代码

	<!--告知spring在创建容器时要扫描的包-->
	<context:component-scan base-package="com.itheima"></context:component-scan>

	<!--配置QueryRunner对象-->
	<bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
		<!--构造方法,注入数据源-->
		<constructor-arg name="ds" ref="dataSource"></constructor-arg>
	</bean>

	<!--配置数据源-->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!--连接数据库的必备信息-->
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy"></property>
		<property name="user" value="root"></property>
		<property name="password" value="root"></property>
	</bean>

Java代码

	@Service("accountService")
	public class AccountServiceImpl implements IAccountService {

		@Autowired
		private IAccountDao accountDao;
	}
	@Repository("accountDao")
	public class AccountDaoImpl implements IAccountDao {

		@Autowired
		private QueryRunner runner;
	}

注意:通过context扫描包的方式,将set方式注入改成注解注入,方便了很多。

3、纯注解配置

父配置类代码

	// 
	/**  
	 * 纯注解配置的知识点:
	 *   1、通过Import导入多个配置文件可以区分配置文件的父子关系,本类为父,import导入的为子
	 *   2、当使用Value("${jdbc.driver}") 引入配置文件的值时,需要在配置类上添加注释	@PropertySource("classpath:com/itheima/config/jdbcConfig.properties"),用于指明配置文件的位置;
	 * 注意:@PropertySource可以加在主配置类,也可以加在次配置类上。
	 */
	@Configuration
	@ComponentScan("com.itheima") // 仅有一个注解值时不需要加大括号。
	@Import(JdbcConfig.class)
	@PropertySource("classpath:com/itheima/config/jdbcConfig.properties")
	public class SpringConfiguration {
	
	}

子配置类代码

	@Configuration
	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).Spring整合junit的配置

Junit测试类

	/** 
	 * Spring整合junit的配置:
	 *	 1、导入spring整合Junit的jar包(坐标)
	 *   2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的。
	 *        @Runwith(SpringJUnit4ClassRunner.class)
	 *   3、告知spring的运行器,spring的ioc创建是基于xml还是注解的,并且说明位置。
	 *		  @ContextConfiguration
	 *			 locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
	 *			 classes:指定注解类所在的位置
	 */
	@RunWith(SpringJUnit4ClassRunner.class)
	@ContextConfiguration(classes = SpringConfiguration.class)
	public class AccountServiceTest {
		@Autowired
		private IAccountService as;

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

pom.xml配置文件

	// 导入此坐标,即可整合spring和junit
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>5.0.2.RELEASE</version>
	</dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值