zoukankan      html  css  js  c++  java
  • 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>
    作者:蓝月

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

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

  • 相关阅读:
    【已解决】Kettle新建数据库连接报错(Mysql,MS Sql Server)
    SQL面试题-练习2
    WIN7bat批处理遍历文件夹,输出当前文件夹下所有文件。
    【已解决】MYSQL安装过程报错,怎么解决?MySQL error 0: Authentication to host 'localhost' for user 'root' using method 'caching_sha2_password' failed with message: Reading from the stream has failed.
    常用外国在线英语词典-单词查询
    Oracle 11g 服务端的安装步骤
    Oracle 查询(SELECT)语句(一)
    Oracle 增删改(INSERT、DELETE、UPDATE)语句
    记录一个 C# 导出 Excel 的坑
    C# 中的浅拷贝与深拷贝
  • 原文地址:https://www.cnblogs.com/viplanyue/p/13573750.html
Copyright © 2011-2022 走看看