no2-spring核心基础
分类: springboot 专栏: springboot学习 标签: spring基础
2023-03-13 19:42:38 1270浏览
1.spring介绍

2.IOC和DI
分别解释ioc和di的概念,代码展示
ioc:控制反转,将bean的创建权由原来程序反转给第三方(spring)
di:依赖注入,某个bean想要完整的创建依赖于其他bean的注入
面试:ioc和di的关系
第一种观点:
ioc强调的是bean创建权的反转,而di强调的是bean的依赖关系,认为不是一回事。
第二种观点
ioc强调的是bean创建权的反转,而di强调的是通过注入的方式反转bean的创建权,认为是一回事。
2.1ioc控制反转实战xml方式
- 先引入jar,这里采用maven的方式
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>- 编写applicationContext配置文件
<bean class="com.springboot.dao.impl.UserInfoDaoImpl" id="userInfoDao">
</bean>建实体类,dao层类,test测试类就不赘述了。
2.2依赖注入过程说明
xml的方式
- 设值注入service
public class UserInfoServiceImpl implements UserInfoService {
private UserInfoDao userInfoDao;
public void setUserInfoDao(UserInfoDao userInfoDao) {
this.userInfoDao = userInfoDao;
}
@Override
public int addUser(UserInfo userInfo) {
return userInfoDao.insertUser(null);
}
}- applicationContext.xml
<bean class="com.springboot.dao.impl.UserInfoDaoImpl" id="userInfoDao"> </bean>
<bean id="userInfoService" class="com.springboot.service.impl.UserInfoServiceImpl">
<property name="userInfoDao" ref="userInfoDao"/>
</bean>注解的方式
这里把applicationContext.xml整个删掉
也有两种写法
- 第一种
配置类如下
@Configuration //applicationContext.xml
public class AppConfig {
@Bean //<bean>
public UserInfoDao userInfoDao(){
return new UserInfoDaoImpl();
}
@Bean
public UserInfoService userInfoService(){
UserInfoService userInfoService = new UserInfoService();
userInfoService.setUserInfoDao(userInfoDao());
return userInfoService;
}
}测试类:
@Test
public void addUser() {
ApplicationContext app = new AnnotationConfigApplicationContext(AppConfig.class);
UserInfoService userInfoService = app.getBean(UserInfoService.class);
userInfoService.addUserinfo();
}- 第二钟
配置类如下
@Configuration //applicationContext.xml
@ComponentScan(value = {"com.jf3q.service","com.jf3q.dao"})
public class AppConfig {
}service和dao层对应加上注解和依赖注入
测试类不变。
这两种方式各自有各自的用处,比如mysql数据源放到bean的话就只能用第一种方式了,因为你不可能进jar包里加注解去。
pom文件
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>配置类
@Configuration //applicationContext.xml
@ComponentScan(value = {"com.jf3q.service","com.jf3q.dao"})
@PropertySource("classpath:datasource.properties")
public class AppConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}2.3拆分spring配置
- xml方式拆分

- 配置类方式拆分

3.spring aop
- 引入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>3.1xml的方式
<aop:config>
<aop:pointcut id="jp" expression="execution(* com.jf3q.service..*.*(..))"/>
<aop:aspect ref="serviceLog">
<aop:before method="before" pointcut-ref="jp" />
<aop:after-returning method="afterReturning" pointcut-ref="jp" returning="result"/>
</aop:aspect>
</aop:config>增强类:
@Log4j
public class UserServiceLog {
public void before(JoinPoint jp){
log.info("调用目标对象"+jp.getTarget()+"的方法:"+jp.getSignature().getName()
+"入参:"+Arrays.toString(jp.getArgs()));
}
public void afterReturning(JoinPoint jp,Object result){
log.info("调用对象:" + jp.getTarget()
+ "\n 方法" + jp.getSignature().getName() + "\n 返回值:" +result);
}
}3.2基于注解的方式
@Log4j
@Component
@Aspect
@EnableAspectJAutoProxy
public class UserServiceLog {
@Pointcut("execution( * com.chract01.service..*.*(..))")
public void point(){
}
@Before("point()")
public void before(JoinPoint jp){
log.info("调用目标对象"+jp.getTarget()+"的方法:"+jp.getSignature().getName()
+"入参:"+Arrays.toString(jp.getArgs()));
}
@AfterReturning(value = "point()",returning = "result")
public void afterReturning(JoinPoint jp,Object result){
log.info("调用对象:" + jp.getTarget()
+ "\n 方法" + jp.getSignature().getName() + "\n 返回值:" +result);
}
剩下的增强类型自己写
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论






新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成