Spring5-IOC容器基于注解管理

1、注解是什么?

  • 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)
  • 注解可以标记类、方法、属性
  • 注解的目的是为了简化xml配置

2、创建对象

  • 针对Bean管理创建对象Spring提供了四个注解
    1、@Component(通用)
    2、@Service(用于逻辑层)
    3、@Controller(用于web层)
    4、@Repository(用于DAO层)

上述注解名称功能相同,只是为了区分类的功能

  • 实现创建对象
    1、引入Spring-aop的依赖jar包
    2、在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">

    <!-- 引入context名称空间,开启组件扫描 -->
    <context:component-scan base-package="com.spring.annotation"></context:component-scan>
</beans>

3、创建类,在类上面添加注解

@Component(value = "user") // 等同于<bean id="user" class="..."></bean>
public class User {

    public void say() {
        System.out.println("hello everyone...");
    }
}
  • 开启组件扫描细节

1、配置指定扫描

<!--
    1、use-default-filters属性指是否使用默认扫描规则,默认是扫描包下面所有类
    2、include-filter标签设置扫描规则
    3、下面扫描组件的意思只扫描com.spring.annotation包下面所有Controller注解的类
-->
<context:component-scan base-package="com.spring.annotation" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

2、忽略某些类

<!--
    1、exclude-filter标签设置扫描规则
    2、下面扫描组件的意思扫描com.spring.annotation包下面所有不是Controller注解的类
-->
<context:component-scan base-package="com.spring.annotation">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

3、属性赋值

  • @Autowired

Autowired注解是根据属性类型进行赋值,适用于对象类型属性;当属性类型为普通类时,将直接赋值该类的对象实例;当属性类型为接口类时,将找到接口的唯一实现类进行赋值,若接口存在多个实现类,需要配合@Qualifier注解一起使用

UserService.java

@Service(value = "userService")
public class UserService {
    @Autowired
    private UserDao userDao;

    public void add() {
        System.out.println("service add");
        userDao.add();
    }
}

UserDao.java

public interface UserDao {
    void add();
}

UserDaoImpl.java

@Repository
public class UserDaoImpl implements UserDao{
    @Override
    public void add() {
        System.out.println("dao add");
    }
}
  • @Qualifier

Qualifier注解适用于对象类型属性赋值,可根据名称直接赋值,需要配合Autowired一起使用;当属性指向某个接口类型时,可指定接口实现类进行赋值

UserService.java

@Service(value = "userService")
public class UserService {
    @Autowired
    @Qualifier(value = "userDaoImpl")
    private UserDao userDao;

    public void add() {
        System.out.println("service add");
        userDao.add();
    }
}

UserDaoImpl.java

@Repository(value = "userDaoImpl")
public class UserDaoImpl implements UserDao{
    @Override
    public void add() {
        System.out.println("dao add");
    }
}
  • @Resource

可根据类型或名称赋值,当注解后有value则使用名称赋值;不需要配合Autowired使用;该类不是Spring提供的,所以不推荐使用

  • @Value

针对非对象类型属性赋值

@Service(value = "userService")
public class UserService {
    @Autowired
    @Qualifier(value = "userDaoImpl")
    private UserDao userDao;

    @Value(value = "test")
    private String name;

    public void add() {
        System.out.println("service add" + name);
        userDao.add();
    }
}

4、初识完全注解开发

注解存在的意义是简化xml配置,完全注解开发就是使用注解配置类完全替代xml配置文件

  • 创建注解配置类
@Configuration //声明为配置类,替代xml配置文件
//组件扫描注解,等同于<context:component-scan base-package="...">
@ComponentScan(basePackages = {"com.spring.annotation"})
public class AnnotationConfig {
}
  • 加载配置
@Test
public void doTest() {
//加载xml文件配置
ApplicationContext appContext =
        new ClassPathXmlApplicationContext("bean3.xml");
}

@Test
public void doTest2() {
//加载注解配置类
ApplicationContext appContext =
        new AnnotationConfigApplicationContext(AnnotationConfig.class);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容