Spring 及Spring部分注解

发布于 2021-04-20  86 次阅读


注解之前要先添加要扫描的包
指定要扫描的包,这个包下的注解就会生效
<context:component-scan base-package="com.kuang.pojo"/>

<?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: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">

<context:component-scan base-package="com.lin.dao"/>
<context:annotation-config/>
</beans>

注: c和p标签
xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"

@Component  //等价于<bean id="user" class="com.lin.pojo.User"/>
@Value("林毓贤") 给属性赋值 <property name="name" value="林毓贤"/>
@Component  //等价于<bean id="user" class="com.lin.pojo.User"/>
public class User {
    @Value("林毓贤")
    public String name;
}

@Autowired
@Qualifier("name") 这两个合着使用自动装配,比较推荐
@Resource(name="name")也可以自动装配 两个默认的都是byType

@Autowired
@Qualifier("cat")
private Cat cat;

@Autowired
private Dog dag;
@Value("毓贤")
private String name;

@Resource(name = "things")
private Things things;

@Component还有几个衍生注解,在web开发中,会按照mvc三层架构分层
dao : @Repository
service : @Service
controller : @Controller
这四个注解功能都是一样,都是代表将某个类注册到Spring中,装配Bean

作用域:@Scope("singleton") 默认单列 "prototype":原型

xml与注解
xml更加万能,适用于任何场合,维护简单方便
注解 不是自己类使用不了,维护相对复杂
xml与注解的最佳实践
xml用来管理bean;
注解只负责完成属性的注入;

在bean中配置各种属性:

去掉xml文件:


在Config包中创建类 ,配置
@Configuration //代表这是一个配置类 ,是我们后台的beans.xml
@ComponentScan("com.lin.pojo") //扫描包
@Import(LinConfig2.class) // 引入其他的xml文件
@Bean //注册一个bean ,相当于之前的bean标签 , 方法的名字相当于id,返回值相当于bean标签中的class属性

@Configuration
@ComponentScan("com.lin.pojo")
@Import(LinConfig2.class)
public class LinConfig {

@Bean
public Person getPerson(){
return new Person();
}
}

动态代理

以后需要添加功能的时候,不需要改变程序结构.

package com.lin.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//使用这个自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    private Object target;

    public void setTarget(Object target){
        this.target = target;
    }

    //生成得到代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    //处理代理实例,并返回结果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());//添加的日志方法
        Object invoke = method.invoke(target, args);
        return invoke;
    }

    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

使用代理类时:

public class Client {
public static void main(String[] args) {
//真实角色
UserService userService = new UserServiceImpl();
//代理角色,不存才
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService);
UserService proxy = (UserService)pih.getProxy();
proxy.delete();
}
}

AOP注解执行

@Aspect //这个类是一个切面
public class AnnotationPointCut {

@Before("execution(* com.lin.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("=====方法执行前====");
}

@After("execution(* com.lin.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("=====方法执行后====");
}

注意:需要在xml中设置注解支持

<bean id="userService" class="com.lin.service.UserServiceImpl"/>
<bean id="annotationPointCut" class="com.lin.annotation.AnnotationPointCut"/>
<!-- 开启注解支持-->
<aop:aspectj-autoproxy/>

Spring-Mybathttp://mybatis.org/spring/zh/index.htmlis

xml的格式如果为utf-8,则其中不能有中文
还需要注意其中导包的版本问题

<?xml version="1.0" encoding="GBK"?>
<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"
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">

<!--主要配置数据库的连接-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/lin/mapper/*.xml"/>
</bean>
<!--sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!--mapper-->
<bean id="userMapper" class="com.lin.mapper.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSession"/>
</bean>

</beans>
package com.lin.mapper;

import com.lin.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;
//在原来,我们所有的操作都使用sqlSession来操作,现在都使用SqlSessionTemplate;
public class UserMapperImpl implements UserMapper
{
private SqlSessionTemplate sqlSessionTemplate;

public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate){
this.sqlSessionTemplate=sqlSessionTemplate;
}
public List<User> getUser() {
UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
return mapper.getUser();

}
}
 @Test
public void test() throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("springDao.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
List<User> user = userMapper.getUser();
for (User user1 : user) {
System.out.println(user1);
}
}


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。