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>
作者:蓝月

-------------------------------------------

个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

原文地址:https://www.cnblogs.com/viplanyue/p/13573750.html