【Spring】(五)Spring 依赖注入以及使用注解实现IOC(二)

简介: 【Spring】(五)Spring 依赖注入以及使用注解实现IOC(二)

使用注解实现IOC


1、注解方式将Bean的定义信息和Bean实现类结合在一起,Spring提供的注解有


@Component:实现Bean组件的定义


@Repository :用于标注DAO类


@Service :用于标注业务类


@Controller :用于标注控制器类


@Repository("userDao") 
public class UserDaoImpl implements UserDao {
}


等效于与在XML配置文件中编写

<bean id="userDao" 
class="dao.impl.UserDaoImpl" />


2、使用@Autowired注解实现Bean的自动装配,默认按类型匹配,可以使用@Qualifier指定Bean的名称


对类的成员变量进行标注

@Service("userService") 
public class UserServiceImpl implements UserService { 
        @Autowired
        @Qualifier("userDao")
        private UserDao dao; 
               …… 
}


也可以对方法的入参进行标注

@Service("userService") 
public class UserServiceImpl implements UserService { 
        private UserDao dao;
        @Autowired
        public void setDao((@Qualifier("userDao") UserDao dao) {
                 this.dao = dao;
        } 
    …… 
}


3、使用注解信息启动Spring容器

<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/context
   http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    <!-- 扫描包中注解标注的类 -->
    <context:component-scan base-package="service,dao" />
</beans>


4、使用Java标准注解完成装配


使用@Resource注解实现组件装配,默认按名称匹配


为dao属性注入名为userDao的Bean


@Service("userService") 
public class UserServiceImpl implements UserService { 
  @Resource(name = "userDao")
  private UserDao dao; 
  …… 
}


查找名为dao的Bean,并注入给dao属性


@Service("userService") 
public class UserServiceImpl implements UserService { 
  @Resource
  private UserDao dao; 
  …… 
}


代码实例


下面我用一个小项目完整的展示Spring使用注解实现IOC


1、User实体类

package userTest.entity;
/**
 * @author:
 * @date:2019/11/4
 * @aim:User实体类
 */
public class User {
    private String name;
    private String pwd;
    public User(){}
    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}


2、Dao层

package userTest.dao;
import org.springframework.stereotype.Component;
import userTest.entity.User;
/**
 * @author:
 * @date:2019/11/4
 * @aim:
 */
@Component("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public boolean addUser(User user) {
        System.out.println("插入一条用户信息");
        return true;
    }
}


3、Service层

package userTest.service;
import org.springframework.stereotype.Service;
import userTest.dao.UserDao;
import userTest.entity.User;
import javax.annotation.Resource;
/**
 * @author:
 * @date:2019/11/4
 * @aim:
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    //@Autowired
    //@Qualifier("userDao")   //两种注入方式
    @Resource(name = "userDao")
    private UserDao dao;
    public UserDao getDao() {
        return dao;
    }
    public void setDao(UserDao dao) {
        this.dao = dao;
    }
    @Override
    public boolean add(User user) {
        boolean flag=dao.addUser(user);
        return flag;
    }
}


4、增强类

package userTest.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import userTest.service.UserService;
import java.util.Arrays;
/**
 * @author:
 * @date:2019/11/4
 * @aim:通知类,并在通知类上添加注解,描述那些切入点应该执行哪种增强处理
 */
@Controller("userAop")
@Aspect
public class UserServiceLogAop {
    Logger log= Logger.getLogger(userTest.aop.UserServiceLogAop.class);
    @Autowired
    @Qualifier("userService")
    private UserService service;
    public UserService getService() {
        return service;
    }
    public void setService(UserService service) {
        this.service = service;
    }
    @Pointcut("execution(public boolean add(userTest.entity.User))")
    public void pointcut(){}
    @Before("pointcut()")
    public void beforeAdd(JoinPoint jp){
        log.info("调用"+jp.getTarget()+"的"+jp.getSignature()+"之前,参数为:"+ Arrays.toString(jp.getArgs()));
    }
    @AfterReturning(pointcut = "pointcut()",returning = "result")
    public void afterAdd(JoinPoint jp, Object result){
        log.info("调用"+jp.getTarget()+"的"+jp.getSignature()+"之后,返回值为:"+result);
    }
    @After("pointcut()")
    public void finalTest(JoinPoint jp){
        log.info(jp.getTarget()+"的"+jp.getSignature()+"方法执行结束");
    }
}


5、配置文件

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       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/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    <!-- 扫描包中注解标注的类 -->
    <context:component-scan base-package="userTest" />
    <!--启用对于@AspectJ注解的支持-->
    <aop:aspectj-autoproxy />
    <!--使用p命名空间注入直接量-->
    <bean id="user" class="userTest.entity.User"
          p:name="Uzi" p:pwd="123456"/>
    <!--使用构造注入-->
    <bean id="user1" class="userTest.entity.User">
        <constructor-arg index="0">
            <value>TheShy</value>
        </constructor-arg>
        <constructor-arg name="pwd" >
            <value>123456</value>
        </constructor-arg>
    </bean>
</beans>


6、测试类

package userTest.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import userTest.entity.User;
public class UserServiceImplTest {
    @Test
    public void add() {
        ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext3.xml");
        UserService userService=(UserService)context.getBean("userService");
        User user= (User) context.getBean("user");
        User user1= (User) context.getBean("user1");
        userService.add(user);
        userService.add(user1);
    }
}


7、结果

[INFO ] 2019-11-05 12:28:44,771 method:userTest.aop.UserServiceLogAop.beforeAdd(UserServiceLogAop.java:42)
调用userTest.service.UserServiceImpl@3c9754d8的boolean userTest.service.UserService.add(User)之前,参数为:[User{name='Uzi', pwd='123456'}]
插入一条用户信息
[INFO ] 2019-11-05 12:28:44,772 method:userTest.aop.UserServiceLogAop.finalTest(UserServiceLogAop.java:52)
userTest.service.UserServiceImpl@3c9754d8的boolean userTest.service.UserService.add(User)方法执行结束
[INFO ] 2019-11-05 12:28:44,773 method:userTest.aop.UserServiceLogAop.afterAdd(UserServiceLogAop.java:47)
调用userTest.service.UserServiceImpl@3c9754d8的boolean userTest.service.UserService.add(User)之后,返回值为:true
[INFO ] 2019-11-05 12:28:44,773 method:userTest.aop.UserServiceLogAop.beforeAdd(UserServiceLogAop.java:42)
调用userTest.service.UserServiceImpl@3c9754d8的boolean userTest.service.UserService.add(User)之前,参数为:[User{name='TheShy', pwd='123456'}]
插入一条用户信息
[INFO ] 2019-11-05 12:28:44,773 method:userTest.aop.UserServiceLogAop.finalTest(UserServiceLogAop.java:52)
userTest.service.UserServiceImpl@3c9754d8的boolean userTest.service.UserService.add(User)方法执行结束
[INFO ] 2019-11-05 12:28:44,773 method:userTest.aop.UserServiceLogAop.afterAdd(UserServiceLogAop.java:47)
调用userTest.service.UserServiceImpl@3c9754d8的boolean userTest.service.UserService.add(User)之后,返回值为:true
目录
相关文章
|
17天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
36 0
|
2月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
24天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
45 4
SpringBoot必须掌握的常用注解!
|
3天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
17 2
|
26天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
84 2
|
26天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
36 1
|
28天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
20天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
21天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
13 0
|
2月前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。