IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> @Autowired注解在spring中的用法 -> 正文阅读

[Java知识库]@Autowired注解在spring中的用法

@Autowired用法详解

@Autowired注解详解——超详细易懂

@Autowired的用法和作用

Autowired must be defined in Spring bean @Component/@Service

导致@Autowired注入失败的问题

Spring@Autowired注解与省去get和set方法,对注解Autowired放在setter方法上的情况

Java开发技术之 SSM框架的学习分享

Spring注解之@Autowired失败的解决方案

springboot中@Autowired 注入失效的四种原因及解决方法

Spring@Autowired注解与省去get和set方法,对注解Autowired放在setter方法上的情况

@Autowired详解

要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么?

首先了解一下IOC操作Bean管理,**bean管理是指(1)spring创建对象 (2)spring注入属性。**当我们在将一个类上标注@Service或者@Controller或@Component或@Repository注解之后,spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean。 当需要使用这个bean的时候,例如加上@Autowired注解的时候,这个bean就会被创建。而且初始化是根据无参构造函数。

先看代码来体会一下这个注解的作用,测试代码如下:(@Data注解是由Lombok库提供的,会生成getter、setter以及equals()、hashCode()、toString()等方法)

@Autowired
这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

<bean id="userDao" class="..."/>
 
<bean id="userService" class="...">
    <property name="userDao">
      <ref bean="userDao"/>
    </property>
</bean>

这样你在userService里面要做一个userDao的setter/getter方法。

但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。

@Autowired
private IUserDao userdao;

在applicatonContext.xml中 把原来 引用的标签也去掉。

    <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。

按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar() 和 setOffice())从Boss 中删除。

public class Boss {    
 
    @Autowired   
    private Car car;    
 
    @Autowired   
    private Office office;      
 
}     
    <bean id="userDao4" class="cn.itcast.spring.UserDaoImpl" />

    <bean id ="userService" class="cn.itcast.spring.UserServiceImpl">
        <!-- 注入对象 -->
        <!-- property 根据类中的setter方法进行属性注入 -->
        <!-- name:setter方法的后缀小写,比如setXxx 对应的name为xxx -->
        <!-- ref:引用哪一个bean(对象),值为bean的id/name -->
        <!--用了Autowired就删掉Property,ref,否则报错-->
       <!-- <property name="userDao4" ref="userDao4" />-->
    </bean>

在这里插入图片描述
在这里插入图片描述
App.java

import beans.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class App {
    public static void main(String[] args) {
        // 方法一: 通过 ApplicationContext 来获取 Spring 的上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //根据上下文对象提供的方法获取到 Bean
        User user1 = (User) context.getBean("user");

        user1.sayHi("Spring1");

        // 方法二: 通过  BeanFactory 来获取 Spring 的上下文对象
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

        //通过类型获取
        User user2 = beanFactory.getBean(User.class);

        user2.sayHi("Spring2");

        // 方法三: 通过 id+类型 来获取
        User user3 = context.getBean("user",User.class);

        user3.sayHi("Spring3");



    }
}

IUserDao

package cn.itcast.spring;

public interface IUserDao {
    public void findByUsernameAndPassword();
}

IUserService

package cn.itcast.spring;

//业务层
public interface IUserService {
    //登录
    public void login();

}

UserDaoFactory

package cn.itcast.spring;

public class UserDaoFactory {
    //提供获取对象的方法
    public UserDaoImpl getUserDAO() {
        //返回实例对象
        return new UserDaoImpl();
    }

    //利用反射技术生产具体类型的实例对象
    public Object getBean() {
        Object bean = null;
        try {
            //传入类字符串,生产对象实例
            bean = Class.forName("cn.itcast.spring.UserDaoImpl").newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回具体类型的对象类型实例
        return bean;
    }
    
}

UserDaoImpl

package cn.itcast.spring;

public class UserDaoImpl implements IUserDao {
    public static int count = 1;
    public static void countMethod() {
        count++;
    }

    @Override
    public void findByUsernameAndPassword() {
        System.out.println("UserDaoImpl-dao层被调用" + count + "次了");
        countMethod();
    }
}


UserServiceImpl

package cn.itcast.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

//业务层实现
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao4;

/*    public void setUserDao4(IUserDao userDao4){
        this.userDao4 = userDao4;
    }*/

    @Override
    public void login() {
        System.out.println("UserServiceImpl-service层被调用了。。。");

        //方式1
        //实例化dao层
        IUserDao userDao = new UserDaoImpl();
        userDao.findByUsernameAndPassword();

        //创建工厂
        UserDaoFactory userDaoFactory = new UserDaoFactory();

        //方式2
        UserDaoImpl userDao1 = userDaoFactory.getUserDAO();
        userDao1.findByUsernameAndPassword();

        //方式3
        //使用反射方法获取对象
        IUserDao userDao2 = (IUserDao) userDaoFactory.getBean();
        userDao2.findByUsernameAndPassword();

        //方式4
        //spring配置方式,创建spring工厂,加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从spring工厂中获取对象,通过bean的id/name
        IUserDao userDao3 = (IUserDao) ac.getBean("userDao3");
        userDao3.findByUsernameAndPassword();

        //方式5
        //不创建工厂
        userDao4.findByUsernameAndPassword();
    }
}

UserServiceImplTest

package cn.itcast.spring;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceImplTest {

    @Test
    public void login() {
 /*       UserServiceImpl userService = new UserServiceImpl();
        userService.login();*/

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        IUserService  userService1 = (IUserService) ac.getBean("userService");
        userService1.login();
    }
}

log4j.properties

log4j.rootLogger=INFO,A1
log4j.logger.org.apache=INFO
log4j.appender.A1.Target=System.err
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <beans>
        <bean id = "user" class="beans.User"></bean>
    </beans>
</beans>


applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    <!-- bean: spring工厂创建的一个对象(反射机制)
	id/name:对象的名字,可以用来引用或者获取对象, 一般为类名或接口名称的首字母小写
	class:要创建的对象类型的类字符串,类名全路径
 -->
    <bean id="userDao3" class="cn.itcast.spring.UserDaoImpl" />

    <bean id="userDao4" class="cn.itcast.spring.UserDaoImpl" />

    <bean id ="userService" class="cn.itcast.spring.UserServiceImpl">
        <!-- 注入对象 -->
        <!-- property 根据类中的setter方法进行属性注入 -->
        <!-- name:setter方法的后缀小写,比如setXxx 对应的name为xxx -->
        <!-- ref:引用哪一个bean(对象),值为bean的id/name -->
        <!--用了Autowired就删掉Property,ref,否则报错-->
       <!-- <property name="userDao4" ref="userDao4" />-->
    </bean>

</beans>

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>org.example</groupId>
    <artifactId>spring1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>


</project>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:59:34  更:2022-09-13 11:01:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:06:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码