IOC操作Bean管理(基于注解方式)
1.什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
(2)使用注解,注解可以作用在类上面,方法上面,属性上面
(3)注解的目的:简化xml配置
2.spring针对Bean管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4) @Repository
上面四个注解功能是一样的,都可以用来创建bean实例
3.基于注解方式实现对象创建
第一步 引入依赖
第二步 开启组件扫描
<!--开启组件扫描
1 如果扫描多个包,多个包使用逗号隔开<context:component-scan base-package="com.atguigu.spring5.demo3dao,com.atguigu.spring5.demo3service"></context:component-scan>
2 扫描包上层目录<context:component-scan base-package="com.atguigu"></context:component-scan>
-->
第三步 创建类,在类上面添加创建对象注解
import org.springframework.stereotype.Component;
//在注解里面value属性值可以省略不写
//默认值是类名称,首字母小写
//UserService--userService
@Component(value="userService")//<bean id="userService" class=".."/>
public class UserService {
public void add(){
System.out.println("service ");
}
}
4.开启组件扫描细节配置
<!--示例1
use-default-filters="false" 表示现在不使用默认filter,自己配置filter
context:include-filter 设置扫描哪些内容
-->
<context:component-scan base-package="com.atguigu" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.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"/>
</context:component-scan>
5.基于注解方式实现属性注入
(1)@Autowired:根据属性类型进行自动装配
第一步 把service和dao对象创建,在service和dao类添加创建对象注解
第二步 在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
@Service
public class UserService {
//定义dao类型属性
//不需要添加set方法
//添加注入属性注解
@Autowired
private UserDao userDao;
public void add(){
System.out.println("service ");
userDao.add();
}
}
(2)@Qualifier:根据属性名称进行注入
这个注解的使用,和上面@Autowired一起使用
//添加注入属性注解
@Autowired //根据类型进行注入
@Qualifier(value="userDaoImpl")
private UserDao userDao;
(3)@Resource:可以根据类型注入,可以根据名称注入
//@Resource //根据类型进行注入
//@Resource(name="userDaoImpl")根据名称进行注入
private UserDao userDao;
(4)@Value:注入普通类型属性
@Value(value="abc")
private String name;
6.完全注解开发
(1)创建配置类,替代xml配置文件
@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {
}
(2)编写测试类
AOP(概念)
1.什么是AOP
(1)面向切面(方面)编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。
AOP(底层原理)
1.AOP底层使用动态代理
(1)有两种情况动态代理
第一种 有接口情况,使用jdk动态代理
第二种 没有接口情况,使用CGLIB动态代理
AOP(jdk动态代理)
1.使用JDK动态代理,使用Proxy类里面的方法创建代理对象。
(1)调用newProxyInstance方法
方法有三个参数
第一个参数,类加载器
第二个参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三个参数,实现这个接口InvocationHandler,创建代理对象,写增强的方法。
2.编写JDK动态代理代码
(1)创建接口,定义方法
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
(2)创建接口实现类,实现方法
public class UserDaoImpl implements UserDao{
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String id) {
return id;
}
}
(3)使用Proxy类创建接口