Spring 基础知识二

java哥 阅读:685 2021-03-31 14:14:48 评论:0

第一:Spring IOC 注解模式

1.1 Spring 依赖jar 包如下:

<!--spring 框架依赖核心jar 包 --> 
		<dependency> 
			<groupId>org.springframework</groupId> 
			<artifactId>spring-context</artifactId> 
			<version>5.0.2.RELEASE</version> 
		</dependency> 
		<dependency> 
			<groupId>org.springframework</groupId> 
			<artifactId>spring-core</artifactId> 
			<version>5.0.2.RELEASE</version> 
		</dependency> 
		<dependency> 
			<groupId>org.springframework</groupId> 
			<artifactId>spring-beans</artifactId> 
			<version>5.0.2.RELEASE</version> 
		</dependency> 
		<dependency> 
			<groupId>org.springframework</groupId> 
			<artifactId>spring-expression</artifactId> 
			<version>5.0.2.RELEASE</version> 
		</dependency> 
		<dependency> 
			<groupId>org.springframework</groupId> 
			<artifactId>spring-aop</artifactId> 
			<version>5.0.2.RELEASE</version> 
		</dependency> 
		<!--spring 框架 log4j 日志集成(推荐使用logback) --> 
		<dependency> 
			<groupId>log4j</groupId> 
			<artifactId>log4j</artifactId> 
			<version>1.2.16</version> 
		</dependency> 
		<dependency> 
			<groupId>commons-logging</groupId> 
			<artifactId>commons-logging</artifactId> 
			<version>1.2</version> 
		</dependency>

1.2 持久层和业务层修改为注解方式

package com.zzg.spring.dao; 
 
/** 
 * 账户持久层接口 
 * @author Administrator 
 * 
 */ 
public interface IAccountDao { 
	/** 
	 * 账户保存 
	 */ 
	void saveAccount(); 
} 
 
package com.zzg.spring.dao.impl; 
 
import org.springframework.stereotype.Component; 
 
import com.zzg.spring.dao.IAccountDao; 
 
/** 
 * 账户持久层接口实现类 
 * @author Administrator 
 * 
 */ 
@Component 
public class AccountDaoImpl implements IAccountDao { 
 
	@Override 
	public void saveAccount() { 
		// TODO Auto-generated method stub 
		System.out.println("账户保存"); 
	} 
 
} 
 
 
package com.zzg.spring.service; 
 
/** 
 * 账户业务层接口 
 * @author Administrator 
 * 
 */ 
public interface IAccountService { 
	/** 
	 * 账户保存 
	 */ 
	void saveAccount(); 
} 
 
 
package com.zzg.spring.service.impl; 
 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
 
import com.zzg.spring.dao.IAccountDao; 
import com.zzg.spring.service.IAccountService; 
 
/** 
 * 账户业务层接口实现类 
 * @author Administrator 
 * 
 */ 
@Component("accountService") 
public class AccountServiceImpl implements IAccountService { 
	// 注入持久层dao 
	@Autowired 
	private IAccountDao dao; 
	 
	@Override 
	public void saveAccount() { 
		// TODO Auto-generated method stub 
		dao.saveAccount(); 
	} 
 
} 

1.3 spring 配置文件和测试功能代码:

<?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.zzg.spring"></context:component-scan> 
</beans> 
package com.zzg.spring; 
 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
import com.zzg.spring.service.IAccountService; 
 
public class Annotation { 
 
	public static void main(String[] args) { 
		// TODO Auto-generated method stub 
		//1.使用 ApplicationContext 接口,就是在获取 spring 容器 
		ApplicationContext ac = new ClassPathXmlApplicationContext("annotation.xml"); 
		 
		IAccountService accountService = (IAccountService) ac.getBean("accountService"); 
		accountService.saveAccount(); 
	} 
 
} 

第二:Spring IOC 注解模式常用注解

2.1 创建对象组件之@Component

作用:把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
属性:value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。

示例:

@Component("accountService") 
public class AccountServiceImpl implements IAccountService

2.2 创建对象组件之@Controller、 @Service和 @Repository

提供了更加明确的语义化。
        @Controller:一般用于表现层的注解。
        @Service:一般用于业务层的注解。
        @Repository:一般用于持久层的注解。

2.3 注入数据组件之@Autowired

       作用:自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。

2.4 注入数据组件之@Qualifier

       作用:在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
       属性:
            value:指定 bean 的 id。

2.5 注入数据组件之@Resource

      作用:直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
      属性:
               name:指定 bean 的 id。

2.6 数据注入组件之@Value

      作用:注入基本数据类型和 String 类型数据的
      属性:
               value:用于指定值

2.7 对象作用范围之@Scope

      作用:指定 bean 的作用范围。
      属性:
               value:指定范围的值。取值:singleton prototype request session globalsession

2.8 对象生命周期之@PostConstruct @PreDestroy

       @PostConstruct作用:用于指定初始化方法。
       @PreDestroy作用:用于指定销毁方法。

第三:Spring IOC 注解模式新增注解

3.1 @Configuration

作用:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要AnnotationApplicationContext(有@Configuration 注解的类.class)。 
属性: 
    value:用于指定配置类的字节码

示例代码:

/** 
* spring 的配置类,相当于 bean.xml 文件 
* @author zhouzhiwengang 
* @Company  
* @Version 1.0 
*/ 
@Configuration 
public class SpringConfiguration { 
} 
注意: 
我们已经把配置文件用类来代替了,但是如何配置创建容器时要扫描的包呢? 
请看下一个注解。

3.2 @ComponentScan

作用:用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的: 
<context:component-scan base-package="com.itheima"/>是一样的。 
属性: 
    basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。

示例代码:

示例代码: 
/** 
* spring 的配置类,相当于 bean.xml 文件 
* @author zhouzhiwengang 
* @Company  
* @Version 1.0 
*/ 
@Configuration 
@ComponentScan("com.zzg.spring.entity") 
public class SpringConfiguration { 
}

3.3 @Bean

作用:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。 
属性: 
    name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。

示例代码:

/** 
* 连接数据库的配置类 
* @author zhouzhiwengang 
* @Company  
* @Version 1.0 
*/ 
public class JdbcConfig { 
/** 
* 创建一个数据源,并存入 spring 容器中 
* @return 
*/ 
@Bean(name="dataSource") 
public DataSource createDataSource() { 
    try { 
        ComboPooledDataSource ds = new ComboPooledDataSource(); 
        ds.setUser("root"); 
        ds.setPassword("1234"); 
        ds.setDriverClass("com.mysql.jdbc.Driver"); 
        ds.setJdbcUrl("jdbc:mysql:///spring_day02"); 
        return ds; 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    }  
} 
/** 
* 创建一个 DBAssit,并且也存入 spring 容器中 
* @param dataSource 
* @return 
*/ 
@Bean(name="dbAssit") 
public DBAssit createDBAssit(DataSource dataSource) { 
    return new DBAssit(dataSource); 
    }  
}

3.4 @PropertySource

作用:用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到 
properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。 
属性: 
    value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:

示例代码:

/** 
* 连接数据库的配置类 
* @author zhouzhiwengang 
* @Company  
* @Version 1.0 
*/ 
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; 
/** 
* 创建一个数据源,并存入 spring 容器中 
* @return 
*/ 
@Bean(name="dataSource") 
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); 
    } }  
} 
jdbc.properties 文件: 
jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/database_spring 
jdbc.username=root 
jdbc.password=1234

3.5 @Import

作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题。 
属性: 
	value[]:用于指定其他配置类的字节码。

示例代码:

@Configuration 
@ComponentScan(basePackages = "com.itheima.spring") 
@Import({ JdbcConfig.class}) 
public class SpringConfiguration { } 
 
@Configuration 
@PropertySource("classpath:jdbc.properties") 
public class JdbcConfig{}

 

标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号