Spring基本配置和注入配置注解使用

Spring基本配置和注入配置注解使用

一、概述

注解替换xml的方案:

常见替换:

二、实验

2.1实验Component替换Bean标签(基本配置注解,以userDao3为例)

a.写标好@Component注解

java 复制代码
package com.itheima.dao.impl;

import com.itheima.dao.UserDao;
import org.springframework.stereotype.Component;
//在注解开发中,属性只有一个,且是叫value的时候可以省略
//<bean class="com.itheima.dao.impl.UserDaoImpl3" id="userDao3"/>
@Component("userDao3")
public class UserDaoImpl3 implements UserDao {
    @Override
    public void show() {

    }
}
java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
    String value() default "";
}

将注解放在相关类的上面实际上就可以省略了全限制名,然后@Component底层又是只有一个value属性,可以是直接省略"value"了

b.配置组件扫描:

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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.itheima"/>
</beans>

测试:

java 复制代码
package com.itheima;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest3 {

    public static void main(String[] args) {

        ClassPathXmlApplicationContext applicationContextTest2 = new ClassPathXmlApplicationContext("applicationContext3.xml");
        Object object = applicationContextTest2.getBean("userDao3");
        Object object2 = applicationContextTest2.getBean("userService3");
        System.out.println(object2);
        System.out.println( object);


    }

}

结果:

拓展:

@Component()的三个注解:

当然了,这几个标签是等价的吗,只不过我们在开发的时候遵循这个规范,见名知意。

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

从@Service的源码里面可以看到其本质还是 @Component(),只不过我们遵循相关的规范,一般只有在Bean不属于上面的三层的情况下我们才使用@Component()注入。

2.2其他标签(就是对应xml配置时标签的属性)

1.@Scope():

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
    @AliasFor("scopeName")
    String value() default "";

    @AliasFor("value")
    String scopeName() default "";

    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

也是只有value属性(scopeName和value是通用的,互为别名,所以默认是一个属性),直接设置为单例模式:

java 复制代码
@Scope("singleton")

2.@Lazy():

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
    boolean value() default true;
}

延迟加载,直接设置为true

java 复制代码
@Lazy(true)

​ 延迟加载可以实现加载完配置文件后还没有加载Bean,知道调用getBean方法时才加载Bean:

2.@PreDestroy()和destroy()

java 复制代码
 @PostConstruct
    public void init(){
            System.out.println("UserDaoImpl3对象初始化了...");
    }
    @PreDestroy
    public void destroy(){
            System.out.println("UserDaoImpl3对象销毁了...");
    }

测试:

java 复制代码
package com.itheima;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest3 {

    public static void main(String[] args) {

        ClassPathXmlApplicationContext applicationContextTest2 = new ClassPathXmlApplicationContext("applicationContext3.xml");
        Object object = applicationContextTest2.getBean("userDao3");
        Object object2 = applicationContextTest2.getBean("userService3");
        System.out.println(object2);
        System.out.println( object);
//        要显示地关闭才会执行销毁方法,Spring容器不知道自己要挂掉了
        applicationContextTest2.close();

    }

}

结果:

2.3Spring依赖注入相关注解(注入配置)

2.3.1概述
2.3.2具体操作

1.@Value():

java 复制代码
    @Value("WangLei")
    private String username;
java 复制代码
 private String username;
@Value("WangLei")
    public void setUsername(String username) {
        this.username = username;
    }

两种方式都可以注入,上面的几个标签都是这样,就不再逐一演示了。但是说像@Value()用在法上的情形是比较少的,主要是用在Spring的框架表达式当中,例如之前我们集成Mybatis的时候注入数据库信息:

java 复制代码
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
java 复制代码
@Value("${jdbc.driver}")
    private String username;

一般是这样用得多。

2.@Autowired():

java 复制代码
 @Autowired
    private UserServiceImpl3 userDao;

3.@Qualifier()

java 复制代码
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

4.@Resource()

java 复制代码
@Resource(name = "userDao3")
    private UserDao userDao;
2.3.3@Autowired拓展

@Autowired注入在方法上时候是比配参数列表的:

java 复制代码
@Autowired
    public void xxx (UserDaoImpl3 userDao){
        System.out.println("xxx:"+userDao);
    }
@Autowired
    public void yyy(List<UserDao> userDaoList){
        System.out.println("yyy:"+userDaoList);
    }

需要UserDaoImpl3就注入UserDaoImpl3,需要UserDao集合有几个就注入几个。

Spring基本配置和注入配置注解使用

一、概述

注解替换xml的方案:

常见替换:

二、实验

2.1实验Component替换Bean标签(基本配置注解,以userDao3为例)

a.写标好@Component注解

java 复制代码
package com.itheima.dao.impl;

import com.itheima.dao.UserDao;
import org.springframework.stereotype.Component;
//在注解开发中,属性只有一个,且是叫value的时候可以省略
//<bean class="com.itheima.dao.impl.UserDaoImpl3" id="userDao3"/>
@Component("userDao3")
public class UserDaoImpl3 implements UserDao {
    @Override
    public void show() {

    }
}
java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
    String value() default "";
}

将注解放在相关类的上面实际上就可以省略了全限制名,然后@Component底层又是只有一个value属性,可以是直接省略"value"了

b.配置组件扫描:

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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.itheima"/>
</beans>

测试:

java 复制代码
package com.itheima;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest3 {

    public static void main(String[] args) {

        ClassPathXmlApplicationContext applicationContextTest2 = new ClassPathXmlApplicationContext("applicationContext3.xml");
        Object object = applicationContextTest2.getBean("userDao3");
        Object object2 = applicationContextTest2.getBean("userService3");
        System.out.println(object2);
        System.out.println( object);


    }

}

结果:

拓展:

@Component()的三个注解:

当然了,这几个标签是等价的吗,只不过我们在开发的时候遵循这个规范,见名知意。

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

从@Service的源码里面可以看到其本质还是 @Component(),只不过我们遵循相关的规范,一般只有在Bean不属于上面的三层的情况下我们才使用@Component()注入。

2.2其他标签(就是对应xml配置时标签的属性)

1.@Scope():

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
    @AliasFor("scopeName")
    String value() default "";

    @AliasFor("value")
    String scopeName() default "";

    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

也是只有value属性(scopeName和value是通用的,互为别名,所以默认是一个属性),直接设置为单例模式:

java 复制代码
@Scope("singleton")

2.@Lazy():

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
    boolean value() default true;
}

延迟加载,直接设置为true

java 复制代码
@Lazy(true)

​ 延迟加载可以实现加载完配置文件后还没有加载Bean,知道调用getBean方法时才加载Bean:

2.@PreDestroy()和destroy()

java 复制代码
 @PostConstruct
    public void init(){
            System.out.println("UserDaoImpl3对象初始化了...");
    }
    @PreDestroy
    public void destroy(){
            System.out.println("UserDaoImpl3对象销毁了...");
    }

测试:

java 复制代码
package com.itheima;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest3 {

    public static void main(String[] args) {

        ClassPathXmlApplicationContext applicationContextTest2 = new ClassPathXmlApplicationContext("applicationContext3.xml");
        Object object = applicationContextTest2.getBean("userDao3");
        Object object2 = applicationContextTest2.getBean("userService3");
        System.out.println(object2);
        System.out.println( object);
//        要显示地关闭才会执行销毁方法,Spring容器不知道自己要挂掉了
        applicationContextTest2.close();

    }

}

结果:

2.3Spring依赖注入相关注解(注入配置)

2.3.1概述
2.3.2具体操作

1.@Value():

java 复制代码
    @Value("WangLei")
    private String username;
java 复制代码
 private String username;
@Value("WangLei")
    public void setUsername(String username) {
        this.username = username;
    }

两种方式都可以注入,上面的几个标签都是这样,就不再逐一演示了。但是说像@Value()用在法上的情形是比较少的,主要是用在Spring的框架表达式当中,例如之前我们集成Mybatis的时候注入数据库信息:

java 复制代码
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
java 复制代码
@Value("${jdbc.driver}")
    private String username;

一般是这样用得多。

2.@Autowired():

java 复制代码
 @Autowired
    private UserServiceImpl3 userDao;

3.@Qualifier()

java 复制代码
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

4.@Resource()

java 复制代码
@Resource(name = "userDao3")
    private UserDao userDao;
2.3.3@Autowired拓展

@Autowired注入在方法上时候是比配参数列表的:

java 复制代码
@Autowired
    public void xxx (UserDaoImpl3 userDao){
        System.out.println("xxx:"+userDao);
    }
@Autowired
    public void yyy(List<UserDao> userDaoList){
        System.out.println("yyy:"+userDaoList);
    }

需要UserDaoImpl3就注入UserDaoImpl3,需要UserDao集合有几个就注入几个。

相关推荐
蓝天星空2 小时前
企业总线、注册中心、网关三者的区别
后端·架构
数新网络2 小时前
赋能某跨境智慧物流:基于 AWS Graviton 的全栈数据平台实现 25% 成本节省
java·云计算·aws
C雨后彩虹2 小时前
ThreadLocal全面总结,从理论到实践再到面试高频题
java·面试·多线程·同步·异步·threadlocal
UIUV2 小时前
语义化搜索学习笔记(结合代码实战)
javascript·后端·node.js
至此流年莫相忘2 小时前
Kubernetes核心概念
java·容器·kubernetes
大鹏说大话2 小时前
深入理解 Go 中的 make(chan chan error):高阶通道的典型用法与实战场景
开发语言·后端·golang
予枫的编程笔记2 小时前
【Docker进阶篇】从入门到精通:Java应用Docker打包,最佳实践与多阶段构建详解
java·docker·容器化·dockerfile·多阶段构建·docker最佳实践·java镜像优化
yuuki2332332 小时前
【C++】模拟实现 红黑树(RBTree)
java·开发语言·c++
玄〤2 小时前
RabbitMQ高级篇总结(黑马微服务课day11)(包含黑马商城业务改造)
java·分布式·spring cloud·微服务·架构·rabbitmq