9、IOC容器 Bean 管理——基于注解方式

一、什么是注解

1、注解是代码特殊标记,格式:@注解名称(属性=属性值,属性=属性值…)
2、使用注解,注解的作用在类上面,方法上面,属性上面在这里插入图片描述
3、使用注解的目的
为了简化xml的配置,让配置使用更优雅,更方便

二、Spring针对Bean管理中创建对象提供注解

1、@Component
@component是spring中的一个注解,它的作用就是实现bean的注入,@component取代。
2、@Service
一般用于我们的业务逻辑层,或者Service层上
3、@Controller
一般用于我们的Web层上
4、@Repository
一般用于我们的dao层
上面的四个注解,他们的功能是一样的,都可以用来创建Bean实例

三、基于注解方式实现对象创建

第一步:引入我们的依赖
将Spring-aop.5.2.6release.jar引入我们的lib包
第二步:开启组件扫描
xmlns:context=“http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
第三步:创建类,在类上面我们创建对象注解

<?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">

<!--    开启组件扫描  1、如果扫描多个包,使用逗号隔开
                    2、扫描包的上层目录
        base-package="com.demo.spring5.dao,com.demo.spring5.service"
-->
    <context:component-scan base-package="com.demo.spring5.dao,com.demo.spring5.service"></context:component-scan>
</beans>
@Component(value = "userService")
//==Component   (value = "userService")可以省略,他会默认创建bean实例为UserService userService首字母小写
//==<bean  id="userService" class="com.demo.spring5.service.UserService"/>
public class UserService {
    
    
    public void add(){
    
    
        System.out.println("service  add.......");
    }
}

	@Test
    public void Test01(){
    
    
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService=context.getBean("userService",UserService.class);
        System.out.println(userService);	//com.demo.spring5.service.UserService@527e5409
        userService.add();	//service  add.......
    }
    

总结:

首先,加载配置,在加载配置文件的时候,扫描到xml中配置的开启组件扫描, <context:component-scan…一生效,Spring就知道底下要用注解方式做到,就会到我们配置的包里面找到所有类,如果类上面有@Component相关的注解,就把你的对象创建,对象创建之后调用sout输出最终把这个过程完成。

四、开启组件扫描中的一些细节问题

<context:component-scan base-package="com.demo.spring5"></context:component-scan>
<!--示例 1
use-default-filters="false" 表示现在不使用默认filter,自己配置filters 默认true 
使用use-default-filters="false"意思就是不使用默认filter,
context:include-filter表示扫描哪些内容
type=“annotation”表示类型为注解
expression="org.springframework.stereotype.Controller"表示扫描带Controller注解修饰的类
-->
    <context:component-scan base-package="com.demo.spring5" use-default-filters="false">
        <context:include-filter type="annotation"
                expression="org.springframework.stereotype.Controller"/><!--代表只扫描Controller注解的类-->
    </context:component-scan>


<!--示例 2
 下面配置扫描包所有内容
 context:exclude-filter: 设置哪些内容不进行扫描
-->
<context:component-scan base-package="com.atguigu">
 <context:exclude-filter type="annotation"

expression="org.springframework.stereotype.Controller"/><!--表示Controller注解的类之外一切都进行扫描-->
</context:component-scan>

五、基于注解方法实现属性的注入

(1)、AutoWired:表示根据你的属性类型进行自动装配
第一步:把service和dao对象创建,在Service和dao类添加对象注解
第二步:在Service注入dao对象,在service类添加dao类型属性,在属性上使用注解

public interface UserDao {
    
    
    public void add();
}

@Repository
public class UserDaoImpl implements UserDao{
    
    
    @Override
    public void add() {
    
    
        System.out.println("若是情短,相思漫长");
    }
}

@Service
public class User {
    
    
    //定义dao类型属性  不需要添加Set方法  添加注入属性注解
    @Autowired  //根据类型进行注入
    private UserDao userDao;
    public void add(){
    
    
        System.out.println("service  add.......");
        userDao.add();
    }
}

	@Test
    public void Test01(){
    
    
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        User user=context.getBean("user", User.class);
        System.out.println(user);	//com.demo.spring5.service.User@4c1d9d4b
        user.add();
        /*service  add.......
		  若是情短,相思漫长*/
    }

(2)、Qualifier:表示根据你的属性名称进行自动装配
这个@Qualifier要和上面的@Aurowire一起使用,根据你的名称进行注入
当一个接口有多个实现类的时候,使用@Autowire不能指定使用哪个实现类,则我们必须要使用@Qualifier进行使用属性名称指定

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao{
    
    
    @Override
    public void add() {
    
    
        System.out.println("若是情短,相思漫长");
    }
}


@Service
public class User {
    
    
    //定义dao类型属性  不需要添加Set方法  添加注入属性注解
    @Autowired  //根据类型进行注入
    @Qualifier(value = "userDaoImpl1")  //根据你的名称进行注入
    private UserDao userDao;
    public void add(){
    
    
        System.out.println("service  add.......");
        userDao.add();
    }
}

(3)、Resource
可以根据类型注入,也可以根据名称注入

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao{
    
    
    @Override
    public void add() {
    
    
        System.out.println("若是情短,相思漫长");
    }
}

	@Resource	//因为没有指定name所以是使用类型注入
    private UserDao userDao;
    public void add(){
    
    
        System.out.println("service  add.......");
        userDao.add();
    }
/*
com.demo.spring5.service.User@223f3642
service  add.......
若是情短,相思漫长
*/

	@Resource(name="userDaoImpl1") //根据名称注入
    private UserDao userDao;
    public void add(){
    
    
        System.out.println("service  add.......");
        userDao.add();
    }
/*
com.demo.spring5.service.User@223f3642
service  add.......
若是情短,相思漫长
*/

(4)、Value
注入普通类型属性

java
@Value(value="abc")
    private String name;

猜你喜欢

转载自blog.csdn.net/m0_53294821/article/details/114829306