Spring基于注解的IOC配置总结


Spring基于Xml的IoC配置总结——SpringIOC容器,IOC中bean标签详解,Spring依赖注入


常用注解详解

1.用于创建对象的注解

@Controller:一般用于表现层的注解。
@Service:一般用于业务层的注解。
@Repository:一般用于持久层的注解。
@Component:所有类都可用。

作用:

相当于在xml中配置一个bean,创建一个对象的实例,并存入SpringIOC容器中,给SpringIOC容器管理。

示例:
@Service(value = "userService")//默认value值是userServiceImpl 
//value属性:相当于xml配置中指定bean的id,如果不指定value属性,默认是当前类首字母小写的类名。  可以理解为在容器中要通过该标识才能找到该对象
public class UserServiceImpl implements UserService {
    public void add(User user) {
        userDao.add(user);
    }
}
理解:
//注解
@Service(value = "userService")
//相当于xml配置文件配置了一个bean
<bean id="userService" class="com.mycode.service.impl.UserServiceImpl" />
//相当于java代码
UserService userService= new com.mycode.service.impl.UserServiceImpl();


2.用于注入数据的注解(实现依赖注入)

  • 理解
//用于注入数据的注解
//相当于xml配置文件配置
<property name="" ref=""><property name="" value="">
@Autowired
  • 作用:默认自动按照类型注入,当使用注解注入属性时,set方法可以省略(用xml配置需要该类提供set方法),只能注入其他bean类型。
  • 注意: 当有多个类型匹配时,使用时要使用@Qualifier(value = "创建对象的注解的属性value值") 指定当前属性需要注入的对象的名字,在spring容器查找,找到了则注入成功,找不到则报错。
@Repository(value = "userDao1")
public class UserDao1Impl implements UserDao {

}

@Repository(value = "userDao2")
public class UserDao2Impl implements UserDao {

}

public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier(value = "userDao1")
    /*@Qualifier: 和@Autowired一起结合使用,在属性上不能单独使用,
    指定当前属性需要注入的对象的名字(创建对象的注解的属性value值,即(相当于)也是xml配置的bean的id值)*/
    private UserDao userDao;
 }


如果像这样有多个类型可以匹配,又不用@Qualifier指定注入那个类型,则报错:
No qualifying bean of type 'com.mycode.dao.UserDao' available: expected single matching bean but found 2: userDao2,userDao1
  • 注入方式:默认根据类型注入,即找UserService 的实现类的Bean对象,将Bean对象赋值给该属性;如果根据类型注入方式注入失败,则根据名字(即创建对象的注解的属性value值)注入。

@Qualifier

  • 作用: 在自动按照类型注入的基础之上,再按照Bean的id注入。在给字段(属性)注入时不能独立使用,必须和@Autowire一起使用;给方法参数注入时,可以独立使用。

@Resource
  • 作用:默认根据 创建对象的注解的value值(即也相当于xml配置Bean的id值)注入,只能注入其他bean类型。
  • 示例
public class UserServiceImpl implements UserService {
    //直接按照bean的id注入
    @Resource(name = "userDao2")
    private UserDao userDao;
 }
  • 注入方式:默认根据名字注入,如果根据名字注入方式失败,则根据类型注入。

@Value
  • 作用:注入基本数据类型和String类型数据, 一般用于注入配置文件中的数据,如jdbc的配置文件。(参考:spring纯注解配置,使用配置类,替换xml配置)


3.用于改变Bean作用范围的注解:

@Scope: 指定bean的作用范围。

  • 示例
@Scope(value = "singleton")
//value属性:指定对象的作用范围  singleton(单例) prototype(多例) request(一次请求) session(一次会话) globalsession
public class UserServiceImpl implements UserService {
}
  • 理解
//用于改变Bean作用范围的注解
//相当于xml配置文件配置
<bean id="" class="" scope="">

4.与Bean生命周期相关的注解

@PostConstruct:指定类中的初始化方法名称,对象创建之后,调用该方法。

@PreDestroy:指定类中销毁方法名称,容器销毁之前调用该方法。

  • 注意:加入注解,要写对应的方法。
  • 理解
//与Bean生命周期相关的注解
//相当于xml配置文件配置
<bean id="" class="" init-method="对象创建之后调用的方法 方法名" destroy-method="对象销毁之前调用的方法 方法名" />

xml配置和注解组合使用注意事项

基于以上注解,xml配置和注解组合使用时,则需要在xml配置中加入以下配置

    <!-- 配置spring创建容器时要扫描的包,扫描指定包的注解-
			以下配值为扫描com.mycode下的所有包
	->
    <context:component-scan base-package="com.mycode" />

这样类中的注解才会有效,像在UserServiceImpl类使用创建对象的注解,而在配置文件中并无做以上配置,则在使用Spring容器获取该类实例化对象时报错:

信息: Loading XML bean definitions from class path resource [beans.xml]
NoSuchBeanDefinitionException: No bean named 'userServiceImpl' available

Spring纯注解配置,使用配置类,替换xml配置

Spring集成DBUtils,基于xml配置的ioc实现业务层和持久层解耦中的xml配置文件,使用配置类替换xml配置来学习其他几个注解

  • 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"
       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.mycode" />

    <!--创建QueryRunner对象   -->
    <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
        <!--使用类中的public QueryRunner(DataSource ds)构造函数给成员变量赋值 根据构造函数中参数的名字注入-->
        <constructor-arg name="ds" ref="datasource"/>
    </bean>

    <!--创建数据源   DruidDataSource-->
    <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
        <!--调用类中的set方法实现注入功能  DruidDataSource类中提供了需要注入成员的set方法-->
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql:///spring" />
        <property name="username" value="root" />
        <property name="password" value="1998" />
    </bean>
    
</beans>

@Configuration:用于指定当前类是一个spring配置类(spring的配置类,相当于xml配置文件),当创建容器时会从该类上加载注解。

@ComponentScan: 用于指定spring在初始化容器时要扫描的包。

@Bean:写在方法上,表明使用此方法创建一个对象,并且放入spring容器。

@PropertySource: 用于加载.properties文件中的配置。

@Import:用于导入其他配置类,则被引入的配置类可以不用写@Configuration注解。 value属性:指定其他配置类的字节码。

  • 示例(spring配置类)
@Configuration
/*@Configuration :用于指定当前类是一个spring配置类(相当于xml配置文件) */

@ComponentScan(value = {"com.mycode"})
/*@ComponentScan :用于指定spring在初始化容器时要扫描的包。
相当于xml配置文件中的:<context:component-scan base-package="com.mycode"/>
*/

@PropertySource(value = "classpath:druid.properties")
/*@PropertySource: 用于加载.properties文件中的配置。
(解决硬编码问题)配置数据源时,可以把连接数据库的信息写到properties配置文件中,使用此注解指定properties配置文件的位置。
如properties配置文件在类路径下,需要加上上classpath:
 */
public class SpringConfig {

    @Value("${url}")
    /*@Value:注入字符串和基本数据类型

    */
    private String url;
    @Value("${myusername}")
    private String username;
    @Value("${password}")
    private String password;
    @Value("${driverClassName}")
    private String driverClassName;


    //创建QueryRunner对象
    @Bean
    /*  @Bean:使用此方法创建一个对象,将创建的对象(返回值)交给Spring容器管理。  注意:这注解只能写在方法上

      ① 创建的对象在Spring容器中的标识(相当于xml配置的bean的id):默认是方法名,则在其他类中引用是引用该方法名
       也可使用name属性:给当前@Bean注解方法 创建的对象 指定一个名称(bean的id),则在其他类中引用的是我们指定的名称。

      ② 如果有方法形参,注入数据的注入方式: 默认根据类型注入,如果根据类型注入方式失败(有多个类型匹配),则根据名称注入。

     */
    public QueryRunner createRunner(DruidDataSource dataSource){
        QueryRunner queryRunner = new QueryRunner(dataSource);
        return queryRunner;
    }

    //创建数据源对象
    @Bean
    public DruidDataSource createDruidDataSource(){
        DruidDataSource druidDataSource = new com.alibaba.druid.pool.DruidDataSource();
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setDriverClassName(driverClassName);
        return druidDataSource;
    }

}
  • druid.properties(Druid数据库连接池的配置文件)
url=jdbc:mysql://127.0.0.1:3306/spring
myusername=root
password=root
driverClassName=com.mysql.jdbc.Driver

当配置文件中的用户名配置为username时报错: 百度:配置文件中 username 与 Mysql 关键字冲突(暂不明确)
在这里插入图片描述

报错信息:

create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/spring, errorCode 1045, state 28000
java.sql.SQLException: Access denied for user '周炜'@'localhost' (using password: YES)

通过纯注解配置如何获取容器

	//参数:配置类的字节码  
  ApplicationContext applicationContext=  new AnnotationConfigApplicationContext(SpringConfig.class);

Spring整合Junit,Spring测试框架

  • 引入依赖
        <!--Spring测试包  封装了junit-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        
         <!--spring5及以上版本要求单元测试junit版本要高于或等于4.12-->
     	 <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
           <version>4.12</version>
        </dependency>

  • 测试类配置步骤
//1.使用@RunWith注解替换原有运行器
@RunWith(SpringJUnit4ClassRunner.class)
/*
2.使用@ContextConfiguration指定spring配置文件的位置
locations属性:用于指定配置文件的位置。类路径下,需要使用classpath:
	例:@ContextConfiguration(locations= {"classpath:beans.xml"})
classes属性:当不使用xml配置时,用于指定spring配置类。
 */
@ContextConfiguration(classes = {SpringConfig.class})
public class SpringDBUtilsTest {
    //3.使用@Autowired给测试类中的变量注入数据
    @Autowired
    private  UserService userService;
    @Test
    public void SelectTest(){
        User user = userService.getById(3);
        System.out.println(user);
    }
}

注:Spring测试类扩展了JUnit,spring框架提供了一个运行器,可以读取配置文件(或注解)来创建容器(即测试程序能自动创建spring容器,无须我们编码创建)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinking in Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值