第五章-初识spring框架

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: ssm 专栏: ssm框架课 标签: spring框架入门

2022-12-06 10:16:37 947浏览

spring框架入门——ioc和aop

1.简单介绍

是一个轻量级的企业级应用框架,企业应用开发的"一站式"选择,贯穿于表现层、业务层、持久层

优点:

  • 低侵入式设计
  • 独立于各种应用服务器
  • 依赖注入特性将组件关系透明化,降低耦合度
  • 面向切面编程特性允许将通用任务进行集中式处理
  • 与第三方框架的良好整合

核心主要是ioc和aop,如何理解参考:

https://blog.csdn.net/javaxuanshou/article/details/109248124

2.spring ioc

将组件对象的控制权从代码本身转移到外部容器。

形象举例子:比如你现在想买瓶水,又想买桶泡面,还要加跟火腿肠,传统的做法就是你现在去家附近的超市去买这几样东西,而采用ioc控制反转的方式就是你在美团平台上找到了附近的小卖部(万一小卖部很远),直接手机上选择你要买的东西下单后对方给送货上门。你在家等着就行。

也就是说传统方式的话是你a对象需要new b对象(水) new c对象(泡面) new d对象(火腿肠),然后才能调用方法

而采用ioc的话就只需要两步1.注册美团会员并登录2.找到想要的东西下单。

类比spring就是美团app

1.在spring的ioc容器中把a,b,c,d先放进去

2.告诉spring,a需要b,c ,d(依赖注入)

2.1第一个spring程序

1.下载jar包

参考文章:https://blog.csdn.net/weixin_45863084/article/details/114660396

这边下载spring5.2.2版本的jar地址:https://repo.spring.io/ui/native/libs-release-local/org/springframework/spring/5.2.2.RELEASE/

使用ioc模块需要的jar:

1.四个spring的核心包

2.为了方便打印日志这里加了log4j和commons-logging包

3.为了方便写测试类这里加了junit4和他的依赖包hamcrest-core包

2.配置applicationContext

 <bean id="helloSpring" class="com.jf3q.controller.HelloSpring">
        <property name="hello" value="反转的人生,如此惊艳!"/>
    </bean>

    <bean id="userDao" class="com.jf3q.dao.impl.UserDaoImpl"></bean>

    <bean id="userService" class="com.jf3q.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>

3.编写bean实体类

    //定义hello属性,该属性的值将通过spring框架进行设置
    private  String hello = null;


    public void print(){
        log.info("spring say :"+ this.getHello()+"!");
    }

    public String getHello() {
        return hello;
    }

    public void setHello(String hello) {
        this.hello = hello;
    }
 public UserDao userDao ;
    @Override
    public void addUser(UserInfo userInfo) {
        userDao.addUser(userInfo);
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

4.编写测试类

 @Test
   public void testSpringAddUser(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean(UserService.class);
        userService.addUser(new UserInfo().setId(1).setPassword("123456").setUsername("xiaojie"));
    }

    @Test
    public  void testHelloSpring(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloSpring helloSpring = context.getBean(HelloSpring.class);
        helloSpring.print();
    }

2.2使用springIOC实现Javabean注入

编写一个打印机程序:

<bean id="a3Paper" class="com.jf3q.printer.A3Paper"></bean>
<bean id="a4Paper" class="com.jf3q.printer.A4Paper"></bean>

<bean id="blackInk" class="com.jf3q.printer.BlackInk"></bean>
<bean id="colorInk" class="com.jf3q.printer.ColorInk"></bean>

<bean id="printer" class="com.jf3q.printer.Printer">
  <property name="ink" ref="blackInk"></property>
  <property name="paper" ref="a4Paper"></property>
</bean>

3.spring aop

切面:与业务逻辑代码不怎么相关,但我们又不得不处理的代码块(随处散落渗透在系统各处,与业务逻辑不相关,但是我们又不得不处理的这些方面)

aop底层是用的动态代理的模式

在不修改源程序的基础上,对代码段增加新的功能,实现代码增强。

形象举例子:你是个富二代,每天最重要的事就是出去玩(这是正事),但那些叠被子,做饭,洗衣服之类的都不是你关注的点,可这些也都非常重要,怎么办直接花钱请人做,等办完正事的时候要回家,直接安排司机过去接。

AOP的好处就是你只需要干你的正事,其它事情别人帮你干。

从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!

案例:编写保存用户的日志增强代码

  1. 添加aop的三个相关jar包

  1. 编写日志增强类
@Log4j
public class UserServiceLog {

    public void before(JoinPoint jp){

        log.info("调用对象:" + jp.getTarget()
                + "\n 方法" + jp.getSignature().getName() + "\n 入参:" + Arrays.toString(jp.getArgs()));
    }


    public void afterReturn(JoinPoint jp,Object result){

        log.info("调用对象:" + jp.getTarget()
                + "\n 方法" + jp.getSignature().getName() + "\n 返回值:" +result);
    }
}
  1. 配置applicationContext.xml文件

    
    <!--配置切面-->
    <aop:config>
        <!--定义切入点-->
        <aop:pointcut id="pc" expression="execution( public void addUser(com.jf3q.pojo.UserInfo))"/>

        <!--引用包含增强方法的bean-->
        <aop:aspect ref="userServiceLog">
            <!--配置前置增强引入切入点-->
            <aop:before method="before" pointcut-ref="pc"/>
            <!--配置后置增强引入切入点-->
            <!--通过returning属性指定名为result的参数注入返回值-->
            <aop:after-returning method="afterReturn" returning="result" pointcut-ref="pc"/>
        </aop:aspect>
    </aop:config>

补充说明:

<aop:pointcut id="pc" expression="execution( * com.jf3q.service..*.*(..))"/>

匹配com.jf3q.service包下及其子包的所有类的所有方法

  1. 编写测试类
@Test
    public  void userServiceLogTest(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean(UserService.class);
        userService.addUser(new UserInfo().setUsername("张三").setPassword("123456"));

    }

spring自带的测试类方式简化代码,前提是必须引入aop

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SysUserMapperTest {
    @Autowired
    SysUserService sysUserService;

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695