Spring_day02_IOC注解开发

一、IOC的注解开发

1、注解开发使用步骤:

(1)引入jar包

(2)创建配置文件

  • log4j.properties
  • applicationContext.xml 
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- 引入约束 -->
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

(3)创建相关包和类

(4)将类的控制权交给Spring容器 

开启IOC注解:

<!-- 配置组件扫描 -->
<context:component-scan base-package="com.wasion.service" />

 在类上添加注解:

(5)编写测试类

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo2 {
    @Test
    public void demo(){

    }
}

(6)依赖注入

2、注解详解

(1)Bean定义注解

XML方式:将id和类绑定

<bean id="UserServiceImpl" class="com.wasion.service.serviceImpl.UserServiceImpl" />

注解方式:只需要在类上添加注解即可

  • @Component :组件 
    • @Controller :修饰web层类
    • @Service :修饰业务层类
    • @Repository :修饰持久层类

@Component是Spring提供的通用的组件注解,可以通过在类上使用该注解,将对应的类标记为Spring Bean,使用此功能需要在Spring配置文件中,开启组件扫描,<context:component-scan base-package="包名"/>

@Component@Component("name")的区别在于,前者只能通过Spring的按类型注入依赖,后者还能使用按名注入依赖。

@Controller、@Service@Repository这三个注解和@Component的功能在目前的4.x.x版本都是一样的,只是表明它是一个组件。不过通过在不同层使用相对应的注解,可以使注解更具有意义。在以后的版本中,Spring可能提供对这三个注解不同的增强。强化分层思想

(2)Bean依赖注入注解

普通类型的属性 

  • @Value :注入普通类型属性
  • 如果属性有set方法,注解需要加到set方法上,如果没有set方法直接在属性上添加注解。

对象类型的属性 

  • @Resource :注入对象类型
  • @Autowired :注入对象类型,默认按照类型注入。结合@Qualifier注解完成按名称的注入。 
    • @Qualifier

 

(3) Bean的作用范围注解

Bean的范围的注解:默认是单例的 

  • @Scope :在类上添加的,控制类生成的时候采用单例还是多例。 
    • singleton :单例(默认)
    • globalsession 集群环境的session域,需要在web环境
    • application: context域,需要在web环境
    • session :session域,需要在web环境
    • request :request域,需要在web环境
    • prototype :多例

PS:可以到WebApplicationContext接口和ConfigurableBeanFactory类中找到@Scope的取值。

(4)Bean的生命周期注解

Bean的生命周期的注解 

  • @PostConstruct :相当于init-method
  • @PreDestroy :相当于destroy-method

3、Spring的IOC的XML方式与注解方式比较

4、context:componet-scan和context:annotation-config的区别
通过<context:annotation-config>的注释可以看出它的作用是激活 
@Required、@Autowired、@PostConstruct、@PreDestroy、@Resource等注解。

通过<context:component-scan base-package="xx"/>的注释可以看出它除了激活了<context:annotation-config>中所有的注解,同时还激活了@Component、@Repository、@Service、@Controller、 @RestController、@ControllerAdvice、@Configuration 这些注解。

二、AOP的XML开发

1、JDK动态代理

(1)创建接口

(2)接口实现类

import com.wasion.service.ServiceTest;
import org.springframework.stereotype.Service;


@Service("serviceTest")
public class ServiceImpl implements ServiceTest {

    @Override
    public void save() {
        System.out.println("保存...");
    }

    @Override
    public void delete() {
        System.out.println("删除...");
    }

    @Override
    public void update() {
        System.out.println("修改...");
    }

    @Override
    public void find() {
        System.out.println("查找...");
    }
}

(3)自定义代理

public class JDKProxy implements InvocationHandler {
    private ServiceTest serviceTest;

    public JDKProxy(ServiceTest serviceTest){
        this.serviceTest = serviceTest;
    }
    public ServiceTest creatProxy(){
        ServiceTest service = (ServiceTest) Proxy.newProxyInstance(serviceTest.getClass().getClassLoader(),
        serviceTest.getClass().getInterfaces(),this);
        return service;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("save".equals(method.getName())){
            System.out.println("权限校验...");
            return method.invoke(serviceTest,args);
        }
        return method.invoke(serviceTest,args);
    }
}

(4)编写测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo4 {
    @Resource(name = "serviceTest")
    private ServiceTest service;

    @Test
    public void test(){
        ServiceTest proxy = new JDKProxy(service).creatProxy();
        proxy.delete();
        proxy.update();
        proxy.find();
        proxy.save();
    }
}

2、AOP相关术语

3、通过AOP配置产生动态代理

(1)创建web项目,引入jar包

(2)引入Spring约束

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--引入约束-->
<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"
        xmlns:aop="http://www.springframework.org/schema/aop"
        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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">


    <context:component-scan base-package="com.wasion.service" />
    <bean id="MyAspect" class="com.wasion.proxy.MyAspectXML" />

</beans>

(3)编写目标类

(4)编写测试类

(5)编写切面类

public class MyAspectXML {

    public void checkPri(){
        System.out.println("权限校验。。。");
    }
}

(6)通过AOP配置对目标类产生代理

结果:

4、Spring的切入点表达式写法

  •  基于excution函数完成的
    • [访问修饰符]  方法返回值  包名.类名.方法名(参数)
    • public  void  com.wasion.service.serviceImpl.ProductServiceImpl.save(..)

可用*占位表示任意的

详见:https://www.jb51.net/article/110461.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值