Java第三十八天,Spring框架系列,基于注解的IOC环境搭建(二)
一、扩展注解
@Configuration
注意:
1.当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写
2.在spring扫描包的时候,会扫描包内所有的类,当且仅当该类为配置类的时候,spring才会对该类里的扫描注解进行扫描
作用:
用于指定当前类是一个 spring 配置类, 当创建容器时会从该类上加载注解。 获取容器时需要使用
AnnotationApplicationContext(有@Configuration 注解的类.class)
属性:
value:用于指定配置类的字节码
例如:
package com.huhai;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfiguration {
}
@ComponentScan
注意:
1..在spring扫描包的时候,会扫描包内所有的类,当且仅当该类为配置类的时候,spring才会对该类里的扫描注解进行扫描
作用:
用于指定 spring 在初始化容器时要扫描的包。 作用和在 spring 的 xml 配置文件中的:
<context:component-scan base-package=""/>是一样的
属性:
basePackages/value:用于指定要扫描的包
例如:
package com.huhai;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan(basePackages = {"com.huhai"})
public class SpringConfiguration {
}
@Bean
注意:
当使用该注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。查找的方式和Autowired注解的作用是一样的
作用:
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器
属性:
name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id),默认为当前方法的名称
例如:
package com.huhai;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
import java.util.GregorianCalendar;
@Configuration
@ComponentScan(basePackages = {"com.huhai"})
public class SpringConfiguration {
/**
* 因为该函数被Bean注解,且有参数
* 所以这里的nowDate会用到下面的getDate()的返回值
*/
@Bean(name = "getYear")
public int getYear(Date nowDate){
return nowDate.getYear();
}
/**
* 该函数会以nowDate(如果没有标明,则默认为函数名)为key,返回值为value放到spring容器中
*/
@Bean(name = "nowDate")
public Date getDate(){
return new GregorianCalendar().getTime();
}
}
@PropertySource
作用:
用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置
属性:
value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath
例如:
info.properties配置文件和读取配置文件的代码分别如下:
sqlUserName=root
sqlPassWord=123456
package com.huhai;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
@PropertySource("classpath:info.properties")
public class JdbcConfiguration {
@Value(value = "${sqlUserName}")
private String userName;
@Value(value = "${sqlPassWord}")
private String pasWord;
@Bean(name = "connect")
public Boolean connectSQL(){
if(userName.equals("root") && pasWord.equals("123456")){
System.out.println("数据库连接成功");
return true;
}else{
System.out.println("数据库连接失败");
return false;
}
}
}
@Import
作用:
用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。 当然,写上也没问题
当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
属性:
value[]:指定一个或多个配置类字节码文件
例如:
package com.huhai;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import java.util.Date;
import java.util.GregorianCalendar;
@Import(JdbcConfiguration.class)
@ComponentScan(basePackages = {"com.huhai"})
public class SpringConfiguration {
}
通过注解获取容器:
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
二、项目代码
1.项目架构:
2.持久层接口
package com.huhai.Dao;
/**
*持久层接口
*/
public interface IAccountDao {
public abstract void save();
public abstract void unSave();
}
3.持久层接口实现类
package com.huhai.Dao.Impl;
import com.huhai.Dao.IAccountDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import java.lang.reflect.Array;
import java.util.*;
/**
* 持久层实现类
*/
@Repository
public class AccountDaoImpl implements IAccountDao {
public void save() {
System.out.println("数据保存成功");
}
public void unSave() {
System.out.println("数据保存失败");
}
}
4.业务层接口
package com.huhai.Service;
/**
*业务层接口
*/
public interface IAccountService {
public abstract void save();
}
5.业务层接口实现类
package com.huhai.Service.Impl;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
/**
* 业务层实现类
*/
@Service
@Scope(value = "singleton")
public class AccountServiceImpl implements IAccountService {
@Resource(name = "accountDaoImpl")
private AccountDaoImpl accountDao;
@Resource(name = "connectState")
private Boolean state;
public void save() {
if(state){
accountDao.save();
}else{
accountDao.unSave();
}
}
@PostConstruct
private void init(){
System.out.println("开始保存数据");
}
@PreDestroy
private void destroy(){
System.out.println("数据保存完成");
}
}
6.info.properties配置文件
sqlUserName=root
sqlPassWord=123456
7.pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.huhai</groupId>
<artifactId>demo14</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
</project>