spring框架-IOC容器_注解方式创建对象_注解方式组件扫描_注解注入属性@Autowried和Qualifier_注入属性@Resource和Value_完全注解开发_demo05/06
注解方式注入对象
注解方式组件扫描
注解注入属性@Autowried和Qualifier
注入属性@Resource和Value
完全注解开发
1 IOC操作Bean管理-基于注解方式
(1)什么是注解
注解是代码的特殊标记格式,
使用注解,注解作用在:类上面 方法上面 属性上面
使用注解的目的:简化xml的配置
(2)Spring针对Bean管理中心创建对象提供的注解
@Component
@Conreoller
@Service
@Repository
以上四个注解的功能都是一样的,都可以用来创建Bean实例,只是我们习惯性的江注解使用在对应的层中
2 基于注解方式,实现对象的创建
第一步 引入依赖
第二步:开启组件扫描
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描
1.如果扫描多个包,多个包之间逗号隔开
2.扫描包的上层目录
-->
<!--<context:component-scan base-package="com.zzy.service,com.zzy.Dao">-->
<context:component-scan base-package="com.zzy">
</context:component-scan>
</beans>
第三步:创建类,在类上面添加创建对象的注解
package com.zzy.service;
import org.springframework.stereotype.Component;
/*注解里面的value可以省略不写,
* 默认值是类名小写
* 其他三个注解也可以使用,效果是一样的
* */
@Component(value = "userService") //加注解类似于xml中的 <bean id=".." class=".."/>
public class UserService {
public void add(){
System.out.println("service add.......");
}
}
第四步:测试输出结果
package com.zzy.test;
import com.zzy.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnnotation {
/*测试注解创界对象
* 注解创建对象的执行流程:
* 1.首先Spring核心容器加载配置文件
* 2.在配置文件中配置开启注解包扫描
* 3.spring回去配置扫描的包中所有类
* 4.若果扫描的类中有spring相关的注解Component Controller Service Repository
* 5.那么spring就会根据注解创建对象
* 6.对象创建之后,调用方法执行操作
* */
@Test
public void testService(){
ApplicationContext context =
new ClassPathXmlApplicationContext("beanAnnotation.xml");
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.add();
}
}
注解创建对象的执行过程
- 注解创建对象的执行流程:
* 1.首先Spring核心容器加载配置文件
* 2.在配置文件中配置开启注解包扫描
* 3.spring回去配置扫描的包中所有类
* 4.若果扫描的类中有spring相关的注解Component Controller Service Repository
* 5.那么spring就会根据注解创建对象
* 6.对象创建之后,调用方法执行操作
3 开启组件扫描的细节问题
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描
1.如果扫描多个包,多个包之间逗号隔开
2.扫描包的上层目录
-->
<!--<context:component-scan base-package="com.zzy.service,com.zzy.Dao">-->
<context:component-scan base-package="com.zzy">
</context:component-scan>
<!--案例1
use-default-filters="false"表示现在不适用默认的过滤器,自己配置filter
context:include-filter 设置扫描那些内容
设置扫描 base-package="com.zzy"下面,包含注解Component的类
-->
<context:component-scan base-package="com.zzy" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Component"/>
</context:component-scan>
<!--案例2
设置扫描所有,除了被Controller注解标识的类不被扫描
-->
<context:component-scan base-package="com.zzy">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
4 基于注解方式实现属性的注入
4.1 Spring中的注解
(1)@AutoWried 根据属性类型进行注入
第一步:把serviceAuto和到创建:在serviceauto和dao类上面添加创建对象的注解
第二步:在servideAuto中注入dao属性:在serviceAuto类中添加dao属性,在属性上面使用@AutoWried注解
package com.zzy.Dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("dao add.............");
}
}
package com.zzy.service;
import com.zzy.Dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceAuto {
//定义Dao类型属性 不需要set方法
@Autowired
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
}
/*测试AutoWried根据类型进行注入*/
@Test
public void testServiceAuto(){
ApplicationContext context =
new ClassPathXmlApplicationContext("beanAnnotation.xml");
UserServiceAuto userServiceAuto = context.getBean("userServiceAuto", UserServiceAuto.class);
System.out.println(userServiceAuto);
userServiceAuto.add();
}
(2)@Qualifier 根据属性名称进行注入
package com.zzy.Dao;
import org.springframework.stereotype.Repository;
@Repository(value = ("UserDaoImpl1"))//默认是类名小写,可以设置别名
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("dao add.............");
}
}
package com.zzy.service;
import com.zzy.Dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class UserServiceAuto {
//定义Dao类型属性 不需要set方法
@Autowired
@Qualifier(value = "UserDaoImpl1")
/* @Qualifier 基于属性名称注入
* 因为UserDao接口可能存在多个实现类,容器不知道需要找哪个实现类进行注入,
* 基于属性名称注入,此属性名必须和UserDaoImpl实现类的别名一致
* */
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
}
(3)@ Resource 可以根据类型注入 也可以根据名称进行注入
package com.zzy.service;
import com.zzy.Dao.UserDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServiceResource {
//@Resource 根据属性类型注入
@Resource(name = "UserDaoImpl1") //根据属性名称注入
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
}
/*测试@Resource根据类型进行注入*/
@Test
public void testServiceResource(){
ApplicationContext context =
new ClassPathXmlApplicationContext("beanAnnotation.xml");
UserServiceResource UserServiceResource = context.getBean("userServiceResource", UserServiceResource.class);
System.out.println(UserServiceResource);
UserServiceResource.add();
}
(4)@Value 注入普通类型属性
/*
* @Value注解的作用是为注入的属性赋值
* */
@Value(value = "属性值")
private String name;
5 完全注解开发
1.创建配置类,替代xml文件
package com.zzy.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/*
* 创建配置类替代xml文件
* */
@Configuration //@Configuration //
@ComponentScan(basePackages = ("com.zzy"))//包扫描
public class SpringConfig {
}
2.编写测试类
package com.zzy.test;
import com.zzy.config.SpringConfig;
import com.zzy.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestAnnotation {
@Test
public void testUserService(){
//加载配置类
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.add();
}
}
3.测试输出结果